5.3.4-stable review
Subsystems (8)
Greg Kroah-Hartman
maintainercover 5.3.4-stable review
This is the start of the stable review cycle for the 5.3.4 release. There are 344 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 05 Oct 2019 03:37:47 PM UTC. 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/v5.x/stable-review/patch-5.3.4-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-5.3.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.3.4-rc1
Pi-Hsun Shih <[email protected]>
platform/chrome: cros_ec_rpmsg: Fix race with host command when probe failed
Lorenzo Bianconi <[email protected]>
mt76: mt7615: fix mt7615 firmware path definitions
Lorenzo Bianconi <[email protected]>
mt76: mt7615: always release sem in mt7615_load_patch
NeilBrown <[email protected]>
md/raid0: avoid RAID0 data corruption due to layout confusion.
Alex Deucher <[email protected]>
drm/amdgpu/display: fix 64 bit divide
Zhan Liu <[email protected]>
drm/amd/display: Add missing HBM support and raise Vega20's uclk.
Charlene Liu <[email protected]>
drm/amd/display: dce11.x /dce12 update formula input
Kai-Heng Feng <[email protected]>
drm/amd/display: Restore backlight brightness after system resume
Pavel Shilovsky <[email protected]>
CIFS: Fix oplock handling for SMB 2.1+ protocols
Murphy Zhou <[email protected]>
CIFS: fix max ea value size
Chris Brandt <[email protected]>
i2c: riic: Clear NACK in tend isr
Laurent Vivier <[email protected]>
hwrng: core - don't wait on add_early_randomness()
Chao Yu <[email protected]>
quota: fix wrong condition in is_quota_modification()
Theodore Ts'o <[email protected]>
ext4: fix punch hole for inline_data file systems
Rakesh Pandit <[email protected]>
ext4: fix warning inside ext4_convert_unwritten_extents_endio
Christophe Kerello <[email protected]>
mtd: rawnand: stm32_fmc2: avoid warnings when building with W=1 option
Tony Camuso <[email protected]>
ipmi: move message error checking to avoid deadlock
Jan Kara <[email protected]>
xfs: Fix stale data exposure when readahead races with hole punch
Jan Kara <[email protected]>
mm: Handle MADV_WILLNEED through vfs_fadvise()
Jan Kara <[email protected]>
fs: Export generic_fadvise()
Tetsuo Handa <[email protected]>
/dev/mem: Bail out upon SIGKILL.
Denis Kenzior <[email protected]>
cfg80211: Purge frame registrations on iftype change
NeilBrown <[email protected]>
md: only call set_in_sync() when it is expected to succeed.
NeilBrown <[email protected]>
md: don't report active array_state until after revalidate_disk() completes.
Xiao Ni <[email protected]>
md/raid6: Set R5_ReadError when there is read failure on parity disk
Jarkko Nikula <[email protected]>
ACPI / LPSS: Save/restore LPSS private registers also on Lynxpoint
Benjamin Coddington <[email protected]>
SUNRPC: Fix buffer handling of GSS MIC without slack
Trond Myklebust <[email protected]>
SUNRPC: Dequeue the request from the receive queue while we're re-encoding
Qu Wenruo <[email protected]>
btrfs: Fix a regression which we can't convert to SINGLE profile
Filipe Manana <[email protected]>
Btrfs: fix race setting up and completing qgroup rescan workers
Qu Wenruo <[email protected]>
btrfs: qgroup: Fix reserved data space leak if we have multiple reserve calls
Qu Wenruo <[email protected]>
btrfs: qgroup: Fix the wrong target io_tree when freeing reserved data space
Dennis Zhou <[email protected]>
btrfs: adjust dirty_metadata_bytes after writeback failure of extent buffer
Nikolay Borisov <[email protected]>
btrfs: Relinquish CPUs in btrfs_compare_trees
Filipe Manana <[email protected]>
Btrfs: fix use-after-free when using the tree modification log
Christophe Leroy <[email protected]>
btrfs: fix allocation of free space cache v1 bitmap pages
Mark Salyzyn <[email protected]>
ovl: filter of trusted xattr results in audit
Ding Xiang <[email protected]>
ovl: Fix dereferencing possible ERR_PTR()
Steve French <[email protected]>
smb3: fix leak in "open on server" perf counter
Steve French <[email protected]>
smb3: fix unmount hang in open_shroot
Steve French <[email protected]>
smb3: allow disabling requesting leases
Yufen Yu <[email protected]>
block: fix null pointer dereference in blk_mq_rq_timed_out()
Damien Le Moal <[email protected]>
block: mq-deadline: Fix queue restart handling
Stefan Assmann <[email protected]>
i40e: check __I40E_VF_DISABLE bit in i40e_sync_filters_subtask
Rakesh Pillai <[email protected]>
ath10k: fix channel info parsing for non tlv target
Jian-Hong Pan <[email protected]>
rtw88: pci: Use DMA sync instead of remapping in RX ISR
Jian-Hong Pan <[email protected]>
rtw88: pci: Rearrange the memory usage for skb in RX ISR
Roberto Sassu <[email protected]>
KEYS: trusted: correctly initialize digests and fix locking issue
Felix Fietkau <[email protected]>
mt76: round up length on mt76_wr_copy
Dave Rodgman <[email protected]>
lib/lzo/lzo1x_compress.c: fix alignment bug in lzo-rle
Michal Hocko <[email protected]>
memcg, kmem: do not fail __GFP_NOFAIL charges
Tetsuo Handa <[email protected]>
memcg, oom: don't require __GFP_FS when invoking memcg OOM killer
Yafang Shao <[email protected]>
mm/compaction.c: clear total_{migrate,free}_scanned before scanning a new zone
Vitaly Wool <[email protected]>
z3fold: fix memory leak in kmem cache
Vitaly Wool <[email protected]>
z3fold: fix retry mechanism in page reclaim
Bob Peterson <[email protected]>
gfs2: clear buf_in_tr when ending a transaction in sweep_bh_for_rgrps
Hans de Goede <[email protected]>
efifb: BGRT: Improve efifb_bgrt_sanity_check
Mark Brown <[email protected]>
regulator: Defer init completion for a while after late_initcall
Nadav Amit <[email protected]>
iommu/vt-d: Fix wrong analysis whether devices share the same bus
Thadeu Lima de Souza Cascardo <[email protected]>
alarmtimer: Use EOPNOTSUPP instead of ENOTSUPP
Will Deacon <[email protected]>
iommu/arm-smmu-v3: Disable detection of ATS and PRI
Shawn Lin <[email protected]>
arm64: dts: rockchip: limit clock rate of MMC controllers for RK3328
Will Deacon <[email protected]>
arm64: tlb: Ensure we execute an ISB following walk cache invalidation
Luis Araneda <[email protected]>
ARM: zynq: Use memcpy_toio instead of memcpy on smp bring-up
Lihua Yao <[email protected]>
ARM: samsung: Fix system restart on S3C6410
Gao Xiang <[email protected]>
staging: erofs: cannot set EROFS_V_Z_INITED_BIT if fill_inode_lazy fails
Amadeusz Sławiński <[email protected]>
ASoC: Intel: Fix use of potentially uninitialized variable
Amadeusz Sławiński <[email protected]>
ASoC: Intel: Skylake: Use correct function to access iomem space
Amadeusz Sławiński <[email protected]>
ASoC: Intel: NHLT: Fix debug print format
Kees Cook <[email protected]>
binfmt_elf: Do not move brk for INTERP-less ET_EXEC
Vladimir Oltean <[email protected]>
spi: spi-fsl-dspi: Exit the ISR with IRQ_NONE when it's not ours
Alexander Sverdlin <[email protected]>
spi: ep93xx: Repair SPI CS lookup tables
Guillaume Tucker <[email protected]>
media: vivid: fix device init when no_error_inj=1 and fb disabled
Arnd Bergmann <[email protected]>
media: don't drop front-end reference count for ->detach
Francois Buergisser <[email protected]>
media: hantro: Set DMA max segment size
Hans de Goede <[email protected]>
media: sn9c20x: Add MSI MS-1039 laptop to flip_dmi_table
Hans Verkuil <[email protected]>
media: videobuf-core.c: poll_wait needs a non-NULL buf pointer
Sean Christopherson <[email protected]>
KVM: x86/mmu: Use fast invalidate mechanism to zap MMIO sptes
Jim Mattson <[email protected]>
kvm: x86: Add "significant index" flag to a few CPUID leaves
Alexander Graf <[email protected]>
KVM: x86: Disable posted interrupts for non-standard IRQs delivery modes
Sean Christopherson <[email protected]>
KVM: x86: Manually calculate reserved bits when loading PDPTRS
Jan Dakinevich <[email protected]>
KVM: x86: set ctxt->have_exception in x86_decode_insn()
Jan Dakinevich <[email protected]>
KVM: x86: always stop emulation on page fault
Hans de Goede <[email protected]>
platform/x86: intel_int0002_vgpio: Fix wakeups not working on Cherry Trail
Helge Deller <[email protected]>
parisc: Disable HP HSC-PCI Cards to prevent kernel crash
Tejun Heo <[email protected]>
fuse: fix beyond-end-of-page access in fuse_parse_cache()
Vasily Averin <[email protected]>
fuse: fix missing unlock_page in fuse_writepage()
Eric Biggers <[email protected]>
fuse: fix deadlock with aio poll and fuse_iqueue::waitq.lock
Jarkko Sakkinen <[email protected]>
tpm: Wrap the buffer from the caller to tpm_buf in tpm_send()
Stefan Berger <[email protected]>
tpm_tis_core: Set TPM_CHIP_FLAG_IRQ before probing for interrupts
Stefan Berger <[email protected]>
tpm_tis_core: Turn on the TPM before probing IRQ's
Madhavan Srinivasan <[email protected]>
powerpc/imc: Dont create debugfs files for cpu-less nodes
Ming Lei <[email protected]>
scsi: implement .cleanup_rq callback
Ming Lei <[email protected]>
blk-mq: add callback of .cleanup_rq
Jan-Marek Glogowski <[email protected]>
ALSA: hda/realtek - PCI quirk for Medion E4254
Peter Zijlstra <[email protected]>
rcu/tree: Fix SCHED_FIFO params
Adam Ford <[email protected]>
ARM: dts: am3517-evm: Fix missing video
Joonwon Kang <[email protected]>
randstruct: Check member structs in is_pure_ops_struct()
Jack Morgenstein <[email protected]>
RDMA: Fix double-free in srq creation error flow
Kaike Wan <[email protected]>
IB/hfi1: Do not update hcrc for a KDETH packet during fault injection
Ira Weiny <[email protected]>
IB/hfi1: Define variables as unsigned long to fix KASAN warning
Danit Goldberg <[email protected]>
IB/mlx5: Free mpi in mp_slave mode
Vincent Whitchurch <[email protected]>
printk: Do not lose last line in kmsg buffer dump
Quinn Tran <[email protected]>
scsi: qla2xxx: Fix Relogin to prevent modifying scan_state flag
Martin Wilck <[email protected]>
scsi: scsi_dh_rdac: zero cdb in send_mode_select()
Takashi Sakamoto <[email protected]>
ALSA: firewire-tascam: check intermediate state of clock status and retry
Takashi Sakamoto <[email protected]>
ALSA: firewire-tascam: handle error code when getting current source of clock
Luca Coelho <[email protected]>
iwlwifi: fw: don't send GEO_TX_POWER_LIMIT command to FW version 36
Adam Ford <[email protected]>
ARM: omap2plus_defconfig: Fix missing video
Adam Ford <[email protected]>
ARM: dts: logicpd-torpedo-baseboard: Fix missing video
MyungJoo Ham <[email protected]>
PM / devfreq: passive: fix compiler warning
Sakari Ailus <[email protected]>
media: omap3isp: Set device on omap3isp subdevs
Jiří Paleček <[email protected]>
kvm: Nested KVM MMUs need PAE root too
Qu Wenruo <[email protected]>
btrfs: Detect unbalanced tree with empty leaf before crashing btree operations
Qu Wenruo <[email protected]>
btrfs: tree-checker: Add ROOT_ITEM check
Qu Wenruo <[email protected]>
btrfs: extent-tree: Make sure we only allocate extents from block groups with the same type
Qu Wenruo <[email protected]>
btrfs: delayed-inode: Kill the BUG_ON() in btrfs_delete_delayed_dir_index()
Oliver Neukum <[email protected]>
zd1211rw: remove false assertion from zd_mac_clear()
Kai-Heng Feng <[email protected]>
iommu/amd: Override wrong IVRS IOAPIC on Raven Ridge systems
Takashi Iwai <[email protected]>
ALSA: hda/realtek - Blacklist PC beep for Lenovo ThinkCentre M73/93
Jani Nikula <[email protected]>
drm: fix module name in edid_firmware log message
Tomas Bortoli <[email protected]>
media: ttusb-dec: Fix info-leak in ttusb_dec_send_command()
Ahzo <[email protected]>
drm/amd/powerplay/smu7: enforce minimal VBITimeout (v2)
Takashi Iwai <[email protected]>
ALSA: hda - Drop unsol event handler for Intel HDMI codecs
Tomas Espeleta <[email protected]>
ALSA: hda - Add a quirk model for fixing Huawei Matebook X right speaker
Kai-Heng Feng <[email protected]>
e1000e: add workaround for possible stalled packet
Kevin Easton <[email protected]>
libertas: Add missing sentinel at end of if_usb.c fw_table
Ulf Hansson <[email protected]>
mmc: mtk-sd: Re-store SDIO IRQs mask at system resume
Nigel Croxon <[email protected]>
raid5: don't increment read_errors on EILSEQ return
Ulf Hansson <[email protected]>
mmc: dw_mmc: Re-store SDIO IRQs mask at system resume
Ulf Hansson <[email protected]>
mmc: core: Add helper function to indicate if SDIO IRQs is enabled
Al Cooper <[email protected]>
mmc: sdhci: Fix incorrect switch to HS mode
Miles Chen <[email protected]>
sched/psi: Correct overly pessimistic size calculation
Ulf Hansson <[email protected]>
mmc: core: Clarify sdio_irq_pending flag for MMC_CAP2_SDIO_IRQ_NOTHREAD
Guoqing Jiang <[email protected]>
raid5: don't set STRIPE_HANDLE to stripe which is in batch list
Hou Tao <[email protected]>
block: make rq sector size accessible for block stats
Jackie Liu <[email protected]>
io_uring: fix wrong sequence setting logic
Lukas Wunner <[email protected]>
spi: bcm2835: Work around DONE bit erratum
Prarit Bhargava <[email protected]>
tools/power/x86/intel-speed-select: Fix memory leak
Peter Ujfalusi <[email protected]>
ASoC: dmaengine: Make the pcm->name equal to pcm->id if the name is not set
Katsuhiro Suzuki <[email protected]>
SoC: simple-card-utils: set 0Hz to sysclk when shutdown
M. Vefa Bicakci <[email protected]>
platform/x86: intel_pmc_core_pltdrv: Module removal warning fix
M. Vefa Bicakci <[email protected]>
platform/x86: intel_pmc_core: Do not ioremap RAM
Gayatri Kammela <[email protected]>
x86/cpu: Add Tiger Lake to Intel family
Marc Zyngier <[email protected]>
irqchip/gic-v3-its: Fix LPI release for Multi-MSI devices
Harald Freudenberger <[email protected]>
s390/crypto: xts-aes-s390 fix extra run-time crypto self tests finding
Christoph Hellwig <[email protected]>
irqchip/sifive-plic: set max threshold for ignored handlers
Peter Zijlstra <[email protected]>
x86/mm: Fix cpumask_of_node() error condition
Masami Hiramatsu <[email protected]>
kprobes: Prohibit probing on BUG() and WARN() address
Peter Ujfalusi <[email protected]>
dmaengine: ti: edma: Do not reset reserved paRAM slots
Yufen Yu <[email protected]>
md/raid1: fail run raid1 array when active disk less than one
Wang Shenran <[email protected]>
hwmon: (acpi_power_meter) Change log level for 'unsafe software power cap'
Marcel Bocu <[email protected]>
hwmon: (k10temp) Add support for AMD family 17h, model 70h CPUs
Kent Overstreet <[email protected]>
closures: fix a race on wakeup from closure_sync
Wenwen Wang <[email protected]>
ACPI / PCI: fix acpi_pci_irq_enable() memory leak
Wenwen Wang <[email protected]>
ACPI: custom_method: fix memory leaks
Marcel Bocu <[email protected]>
x86/amd_nb: Add PCI device IDs for family 17h, model 70h
Marek Szyprowski <[email protected]>
ARM: dts: exynos: Mark LDO10 as always-on on Peach Pit/Pi Chromebooks
Maxime Ripard <[email protected]>
ASoC: dt-bindings: sun4i-spdif: Fix dma-names warning
Tzvetomir Stoyanov <[email protected]>
libtraceevent: Change users plugin directory
Eric Dumazet <[email protected]>
iommu/iova: Avoid false sharing on fq_timer_on
Dan Williams <[email protected]>
libata/ahci: Drop PCS quirk for Denverton and beyond
Cezary Rojewski <[email protected]>
ASoC: Intel: Haswell: Adjust machine device private context
Qian Cai <[email protected]>
iommu/amd: Silence warnings under memory pressure
Takashi Sakamoto <[email protected]>
ALSA: firewire-motu: add support for MOTU 4pre
Anton Eidelman <[email protected]>
nvme-multipath: fix ana log nsid lookup when nsid is not found
Tom Wu <[email protected]>
nvmet: fix data units read and written counters in SMART log
Song Liu <[email protected]>
x86/mm/pti: Handle unaligned address gracefully in pti_clone_pagetable()
Shengjiu Wang <[email protected]>
ASoC: fsl_ssi: Fix clock control issue in master mode
Thomas Gleixner <[email protected]>
x86/mm/pti: Do not invoke PTI functions when PTI is disabled
Andrew Murray <[email protected]>
jump_label: Don't warn on __exit jump entries
Andrew Murray <[email protected]>
arm64: Use correct ll/sc atomic constraints
Arnaldo Carvalho de Melo <[email protected]>
perf evlist: Use unshare(CLONE_FS) in sb threads to let setns(CLONE_NEWNS) work
Mark Rutland <[email protected]>
arm64: kpti: ensure patched kernel text is fetched from PoU
Neil Horman <[email protected]>
x86/apic/vector: Warn when vector space exhaustion breaks affinity
Neil Armstrong <[email protected]>
arm64: dts: meson: fix boards regulators states format
Douglas RAILLARD <[email protected]>
sched/cpufreq: Align trace event behavior of fast switching
Al Stone <[email protected]>
ACPI / CPPC: do not require the _PSD method
Katsuhiro Suzuki <[email protected]>
ASoC: es8316: fix headphone mixer volume table
Dan Murphy <[email protected]>
leds: lm3532: Fixes for the driver for stability
Mauro Carvalho Chehab <[email protected]>
media: ov9650: add a sanity check
Mauro Carvalho Chehab <[email protected]>
media: aspeed-video: address a protential usage of an unitialized var
Gustavo A. R. Silva <[email protected]>
perf script: Fix memory leaks in list_scripts()
Andi Kleen <[email protected]>
perf report: Fix --ns time sort key output
Benjamin Peterson <[email protected]>
perf trace beauty ioctl: Fix off-by-one error in cmd->string table
Maciej S. Szmigiero <[email protected]>
media: saa7134: fix terminology around saa7134_i2c_eeprom_md7134_gate()
Wenwen Wang <[email protected]>
media: cpia2_usb: fix memory leaks
Wenwen Wang <[email protected]>
media: saa7146: add cleanup in hexium_attach()
Hans Verkuil <[email protected]>
media: cec-notifier: clear cec_adap in cec_notifier_unregister
Kamil Konieczny <[email protected]>
PM / devfreq: exynos-bus: Correct clock enable sequence
Leonard Crestez <[email protected]>
PM / devfreq: passive: Use non-devm notifiers
Masahiro Yamada <[email protected]>
ARM: OMAP2+: move platform-specific asm-offset.h to arch/arm/mach-omap2
Ezequiel Garcia <[email protected]>
PM / devfreq: Fix kernel oops on governor module load
Geert Uytterhoeven <[email protected]>
soc: renesas: Enable ARM_ERRATA_754322 for affected Cortex-A9
Geert Uytterhoeven <[email protected]>
soc: renesas: rmobile-sysc: Set GENPD_FLAG_ALWAYS_ON for always-on domain
Masahiro Yamada <[email protected]>
ARM: at91: move platform-specific asm-offset.h to arch/arm/mach-at91
Yazen Ghannam <[email protected]>
EDAC/amd64: Decode syndrome before translating address
Yazen Ghannam <[email protected]>
EDAC/amd64: Recognize DRAM device type ECC capability
Gerald BAEZA <[email protected]>
libperf: Fix alignment trap with xyarray contents in 'perf stat'
Anson Huang <[email protected]>
cpufreq: imx-cpufreq-dt: Add i.MX8MN support
Yazen Ghannam <[email protected]>
EDAC/amd64: Support more than two controllers for chip selects handling
Wenwen Wang <[email protected]>
media: dvb-core: fix a memory leak bug
Thomas Gleixner <[email protected]>
posix-cpu-timers: Sanitize bogus WARNONS
Sean Young <[email protected]>
media: dvb-frontends: use ida for pll number
A Sun <[email protected]>
media: mceusb: fix (eliminate) TX IR signal length limit
Vasily Gorbik <[email protected]>
s390/kasan: provide uninstrumented __strlen
James Morse <[email protected]>
arm64: entry: Move ct_user_exit before any other exception
Liguang Zhang <[email protected]>
ACPI / APEI: Release resources if gen_pool_add() fails
Mike Christie <[email protected]>
nbd: add missing config put
Codrin Ciubotariu <[email protected]>
ASoC: mchp-i2s-mcc: Fix unprepare of GCLK
Wenwen Wang <[email protected]>
led: triggers: Fix a memory leak bug
Codrin Ciubotariu <[email protected]>
ASoC: mchp-i2s-mcc: Wait for RX/TX RDY only if controller is running
Maxime Ripard <[email protected]>
ASoC: sun4i-i2s: Don't use the oversample to calculate BCLK
Arnaldo Carvalho de Melo <[email protected]>
tools headers: Fixup bitsperlong per arch includes
Michael Ellerman <[email protected]>
powerpc/Makefile: Always pass --synthetic to nm if supported
Kunihiko Hayashi <[email protected]>
ASoC: uniphier: Fix double reset assersion when transitioning to suspend state
Hans Verkuil <[email protected]>
media: hdpvr: add terminating 0 at end of string
Hans Verkuil <[email protected]>
media: radio/si470x: kill urb on error
Hans de Goede <[email protected]>
x86/platform/intel/iosf_mbi Rewrite locking
Stefan Agner <[email protected]>
ARM: dts: imx7-colibri: disable HS400
Bjorn Andersson <[email protected]>
arm64: dts: qcom: qcs404-evb: Mark WCSS clocks protected
André Draszik <[email protected]>
ARM: dts: imx7d: cl-som-imx7: make ethernet work again
Finn Thain <[email protected]>
m68k: Prevent some compiler warnings in Coldfire builds
Arnd Bergmann <[email protected]>
net: lpc-enet: fix printk format strings
Mark Rutland <[email protected]>
kasan/arm64: fix CONFIG_KASAN_SW_TAGS && KASAN_INLINE
Ezequiel Garcia <[email protected]>
media: imx: mipi csi-2: Don't fail if initial state times-out
Sakari Ailus <[email protected]>
media: omap3isp: Don't set streaming state on random subdevs
Ezequiel Garcia <[email protected]>
media: i2c: ov5645: Fix power sequence
Colin Ian King <[email protected]>
media: vsp1: fix memory leak of dl on error return path
Tan Xiaojun <[email protected]>
perf record: Support aarch64 random socket_id assignment
Arnd Bergmann <[email protected]>
ARM: xscale: fix multi-cpu compilation
Arnd Bergmann <[email protected]>
dmaengine: iop-adma: use correct printk format strings
Darius Rad <[email protected]>
media: rc: imon: Allow iMON RC protocol for ffdc 7e device
John Keeping <[email protected]>
perf unwind: Fix libunwind when tid != pid
Kees Cook <[email protected]>
arm64/efi: Move variable assignments after SECTIONS
Sean Young <[email protected]>
media: em28xx: modules workqueue not inited for 2nd device
Geert Uytterhoeven <[email protected]>
media: fdp1: Reduce FCP not found message level to debug
Wolfram Sang <[email protected]>
media: i2c: tda1997x: prevent potential NULL pointer access
Matthias Brugger <[email protected]>
media: mtk-mdp: fix reference count on old device tree
Arnaldo Carvalho de Melo <[email protected]>
perf test vfs_getname: Disable ~/.perfconfig to get default output
Arnaldo Carvalho de Melo <[email protected]>
perf config: Honour $PERF_CONFIG env var to specify alternate .perfconfig
Hans Verkuil <[email protected]>
media: gspca: zero usb_buf on error
zhengbin <[email protected]>
blk-mq: Fix memory leak in blk_mq_init_allocated_queue error handling
Peter Zijlstra <[email protected]>
idle: Prevent late-arriving interrupts from disrupting offline
Phil Auld <[email protected]>
sched/fair: Use rq_lock/unlock in online_fair_sched_group
Sudeep Holla <[email protected]>
firmware: arm_scmi: Check if platform has released shmem before using
Xiaofei Tan <[email protected]>
efi: cper: print AER info of PCIe fatal error
Stephen Douthit <[email protected]>
EDAC, pnd2: Fix ioremap() size in dnv_rd_reg()
Luke Mujica <[email protected]>
perf tools: Fix paths in include statements
Alessio Balsini <[email protected]>
loop: Add LOOP_SET_DIRECT_IO to compat ioctl
Jiri Slaby <[email protected]>
ACPI / processor: don't print errors for processorIDs == 0xff
Keyon Jie <[email protected]>
ASoC: hdac_hda: fix page fault issue by removing race
Valdis Kletnieks <[email protected]>
RAS: Build debugfs.o only when enabled in Kconfig
Valdis Kletnieks <[email protected]>
RAS: Fix prototype warnings
YueHaibing <[email protected]>
media: staging: tegra-vde: Fix build error
Randy Dunlap <[email protected]>
media: media/platform: fsl-viu.c: fix build for MICROBLAZE
Guoqing Jiang <[email protected]>
md: don't set In_sync if array is frozen
Guoqing Jiang <[email protected]>
md: don't call spare_active in md_reap_sync_thread if all member devices can't work
Yufen Yu <[email protected]>
md/raid1: end bio when the device faulty
Qian Cai <[email protected]>
arm64/prefetch: fix a -Wtype-limits warning
Kuninori Morimoto <[email protected]>
ASoC: rsnd: don't call clk_get_rate() under atomic context
Dan Carpenter <[email protected]>
EDAC/altera: Use the proper type for the IRQ status bits
chenzefeng <[email protected]>
ia64:unwind: fix double free for mod->arch.init_unw_table
Ard van Breemen <[email protected]>
ALSA: usb-audio: Skip bSynchAddress endpoint check if it is invalid
Vinod Koul <[email protected]>
base: soc: Export soc_device_register/unregister APIs
Neil Armstrong <[email protected]>
soc: amlogic: meson-clk-measure: protect measure with a mutex
Junhua Huang <[email protected]>
arm64: mm: free the initrd reserved memblock in a aligned manner
Charles Keepax <[email protected]>
gpio: madera: Add support for Cirrus Logic CS47L92
Richard Fitzgerald <[email protected]>
gpio: madera: Add support for Cirrus Logic CS47L15
Rafael J. Wysocki <[email protected]>
cpuidle: teo: Allow tick to be stopped if PM QoS is used
Oliver Neukum <[email protected]>
media: iguanair: add sanity checks
Anson Huang <[email protected]>
arm64: dts: imx8mq: Correct OPP table according to latest datasheet
Robert Richter <[email protected]>
EDAC/mc: Fix grain_bits calculation
Paul E. McKenney <[email protected]>
rcu: Add destroy_work_on_stack() to match INIT_WORK_ONSTACK()
Jia-Ju Bai <[email protected]>
ALSA: i2c: ak4xxx-adda: Fix a possible null pointer dereference in build_adc_controls()
Takashi Iwai <[email protected]>
ALSA: hda - Show the fatal CORB/RIRB error more clearly
Thomas Gleixner <[email protected]>
x86/apic: Soft disable APIC before initializing it
Juri Lelli <[email protected]>
rcu/tree: Call setschedule() gp ktread to SCHED_FIFO outside of atomic region
Grzegorz Halat <[email protected]>
x86/reboot: Always use NMI fallback when shutdown via reboot vector IPI fails
Juri Lelli <[email protected]>
sched/deadline: Fix bandwidth accounting at all levels after offline migration
Thomas Gleixner <[email protected]>
x86/apic: Make apic_pending_intr_clear() more robust
Juri Lelli <[email protected]>
sched/core: Fix CPU controller for !RT_GROUP_SCHED
Vincent Guittot <[email protected]>
sched/fair: Fix imbalance due to CPU affinity
Paul E. McKenney <[email protected]>
time/tick-broadcast: Fix tick_broadcast_offline() lockdep complaint
Fabio Estevam <[email protected]>
media: i2c: ov5640: Check for devm_gpiod_get_optional() error
Luke Nowakowski-Krijger <[email protected]>
media: hdpvr: Add device num check and handling
Arnd Bergmann <[email protected]>
media: vivid: work around high stack usage with clang
Michael Tretter <[email protected]>
media: vb2: reorder checks in vb2_poll()
Vandana BN <[email protected]>
media: vivid:add sanity check to avoid divide error and set value to 1 if 0.
Wen Yang <[email protected]>
media: exynos4-is: fix leaked of_node references
Pan Xiuli <[email protected]>
ASoC: SOF: pci: mark last_busy value at runtime PM init
Sean Young <[email protected]>
media: mtk-cir: lower de-glitch counter for rc-mm protocol
Arnd Bergmann <[email protected]>
media: dib0700: fix link error for dibx000_i2c_set_speed
Kai Vehmanen <[email protected]>
ASoC: SOF: reset DMA state in prepare
Nick Stoughton <[email protected]>
leds: leds-lp5562 allow firmware files up to the maximum length
Stefan Wahren <[email protected]>
dmaengine: bcm2835: Print error in case setting DMA mask fails
Stephen Boyd <[email protected]>
firmware: qcom_scm: Use proper types for dma mappings
Oleksandr Suvorov <[email protected]>
ASoC: sgtl5000: Fix charge pump source assignment
Oleksandr Suvorov <[email protected]>
ASoC: sgtl5000: Fix of unmute outputs on probe
Lucas Stach <[email protected]>
ASoC: tlv320aic31xx: suppress error message for EPROBE_DEFER
Andy Shevchenko <[email protected]>
spi: dw-mmio: Clock should be shut when error occurs
Axel Lin <[email protected]>
regulator: lm363x: Fix n_voltages setting for lm36274
Axel Lin <[email protected]>
regulator: lm363x: Fix off-by-one n_voltages for lm3632 ldo_vpos/ldo_vneg
Takashi Iwai <[email protected]>
ALSA: hda/hdmi - Don't report spurious jack state changes
Hariprasad Kelam <[email protected]>
cpufreq: ap806: Add NULL check after kcalloc
Ranjani Sridharan <[email protected]>
ASoC: SOF: Intel: hda: Make hdac_device device-managed
Chris Wilson <[email protected]>
ALSA: hda: Flush interrupts on disabling
Ori Nimron <[email protected]>
nfc: enforce CAP_NET_RAW for raw sockets
Ori Nimron <[email protected]>
ieee802154: enforce CAP_NET_RAW for raw sockets
Ori Nimron <[email protected]>
ax25: enforce CAP_NET_RAW for raw sockets
Ori Nimron <[email protected]>
appletalk: enforce CAP_NET_RAW for raw sockets
Ori Nimron <[email protected]>
mISDN: enforce CAP_NET_RAW for raw sockets
Bodong Wang <[email protected]>
net/mlx5: Add device ID of upcoming BlueField-2
Eric Dumazet <[email protected]>
tcp: better handle TCP_USER_TIMEOUT in SYN_SENT state
Eric Dumazet <[email protected]>
net: sched: fix possible crash in tcf_action_destroy()
Saeed Mahameed <[email protected]>
net/mlx5e: Fix traffic duplication in ethtool steering
David Ahern <[email protected]>
vrf: Do not attempt to create IPv6 mcast rule if IPv6 is disabled
Cong Wang <[email protected]>
net_sched: add policy validation for action attributes
David Ahern <[email protected]>
ipv4: Revert removal of rt_uses_gateway
Vinicius Costa Gomes <[email protected]>
net/sched: cbs: Fix not adding cbs instance to list
Hans Andersson <[email protected]>
net: phy: micrel: add Asym Pause workaround for KSZ9021
David Ahern <[email protected]>
selftests: Update fib_nexthop_multiprefix to handle missing ping6
Eric Dumazet <[email protected]>
ipv6: fix a typo in fib6_rule_lookup()
Dmytro Linkin <[email protected]>
net/mlx5e: Fix matching on tunnel addresses type
Ka-Cheong Poon <[email protected]>
net/rds: Check laddr_check before calling it
Oliver Neukum <[email protected]>
usbnet: sanity checking of packet sizes and device mtu
Bjørn Mork <[email protected]>
usbnet: ignore endpoints with invalid wMaxPacketSize
Kevin(Yudong) Yang <[email protected]>
tcp_bbr: fix quantization code to not raise cwnd if not probing bandwidth
Stephen Hemminger <[email protected]>
skge: fix checksum byte order
David Ahern <[email protected]>
selftests: Update fib_tests to handle missing ping6
Eric Dumazet <[email protected]>
sch_netem: fix a divide by zero in tabledist()
Takeshi Misawa <[email protected]>
ppp: Fix memory leak in ppp_write
Li RongQing <[email protected]>
openvswitch: change type of UPCALL_PID attribute to NLA_UNSPEC
Navid Emamdoost <[email protected]>
nfp: flower: prevent memory leak in nfp_flower_spawn_phy_reprs
Navid Emamdoost <[email protected]>
nfp: flower: fix memory leak in nfp_flower_spawn_vnic_reprs
Thierry Reding <[email protected]>
net: stmmac: Fix page pool size
Cong Wang <[email protected]>
net_sched: add max len check for TCA_KIND
Davide Caratti <[email protected]>
net/sched: act_sample: don't push mac header on ip6gre ingress
Bjorn Andersson <[email protected]>
net: qrtr: Stop rx_worker before freeing node
Peter Mamonov <[email protected]>
net/phy: fix DP83865 10 Mbps HDX loopback disable function
Xin Long <[email protected]>
macsec: drop skb sk before calling gro_cells_receive
Jason A. Donenfeld <[email protected]>
ipv6: do not free rt if FIB_LOOKUP_NOREF is set on suppress rule
Bjørn Mork <[email protected]>
cdc_ncm: fix divide-by-zero caused by invalid wMaxPacketSize
Uwe Kleine-König <[email protected]>
arcnet: provide a buffer big enough to actually receive packets
-------------
Diffstat:
.../bindings/sound/allwinner,sun4i-a10-spdif.yaml | 4 +- Documentation/sound/hd-audio/models.rst | 3 + Makefile | 4 +- arch/arm/boot/dts/am3517-evm.dts | 23 +- arch/arm/boot/dts/exynos5420-peach-pit.dts | 1 + arch/arm/boot/dts/exynos5800-peach-pi.dts | 1 + arch/arm/boot/dts/imx7-colibri.dtsi | 1 + arch/arm/boot/dts/imx7d-cl-som-imx7.dts | 4 +- arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi | 37 +-- arch/arm/configs/omap2plus_defconfig | 1 + arch/arm/mach-at91/.gitignore | 1 + arch/arm/mach-at91/Makefile | 5 +- arch/arm/mach-at91/pm_suspend.S | 2 +- arch/arm/mach-ep93xx/edb93xx.c | 2 +- arch/arm/mach-ep93xx/simone.c | 2 +- arch/arm/mach-ep93xx/ts72xx.c | 4 +- arch/arm/mach-ep93xx/vision_ep9307.c | 2 +- arch/arm/mach-omap2/.gitignore | 1 + arch/arm/mach-omap2/Makefile | 5 +- arch/arm/mach-omap2/sleep33xx.S | 2 +- arch/arm/mach-omap2/sleep43xx.S | 2 +- arch/arm/mach-zynq/platsmp.c | 2 +- arch/arm/mm/copypage-xscale.c | 6 +- arch/arm/plat-samsung/watchdog-reset.c | 1 + .../boot/dts/amlogic/meson-g12b-odroid-n2.dts | 4 +- .../boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts | 4 +- .../arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts | 4 +- arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi | 4 +- .../dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts | 4 +- .../dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts | 4 +- arch/arm64/boot/dts/freescale/imx8mq.dtsi | 5 +- arch/arm64/boot/dts/qcom/qcs404-evb.dtsi | 4 +- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 3 + arch/arm64/include/asm/atomic_ll_sc.h | 89 +++--- arch/arm64/include/asm/cputype.h | 21 +- arch/arm64/include/asm/exception.h | 2 + arch/arm64/include/asm/tlbflush.h | 1 + arch/arm64/kernel/cpufeature.c | 2 +- arch/arm64/kernel/entry.S | 36 +-- arch/arm64/kernel/image-vars.h | 51 ++++ arch/arm64/kernel/image.h | 42 --- arch/arm64/kernel/traps.c | 9 + arch/arm64/kernel/vmlinux.lds.S | 2 + arch/arm64/mm/init.c | 6 +- arch/arm64/mm/proc.S | 9 + arch/ia64/kernel/module.c | 8 +- arch/m68k/include/asm/atarihw.h | 9 - arch/m68k/include/asm/io_mm.h | 6 +- arch/m68k/include/asm/macintosh.h | 1 + arch/powerpc/Makefile | 2 - arch/powerpc/platforms/powernv/opal-imc.c | 12 +- arch/s390/crypto/aes_s390.c | 6 + arch/s390/include/asm/string.h | 9 +- arch/x86/include/asm/intel-family.h | 3 + arch/x86/include/asm/kvm_host.h | 7 + arch/x86/kernel/amd_nb.c | 3 + arch/x86/kernel/apic/apic.c | 115 ++++--- arch/x86/kernel/apic/vector.c | 11 + arch/x86/kernel/smp.c | 46 +-- arch/x86/kvm/cpuid.c | 6 + arch/x86/kvm/emulate.c | 2 + arch/x86/kvm/mmu.c | 47 +-- arch/x86/kvm/svm.c | 4 +- arch/x86/kvm/vmx/vmx.c | 6 +- arch/x86/kvm/x86.c | 21 +- arch/x86/mm/numa.c | 4 +- arch/x86/mm/pti.c | 8 +- arch/x86/platform/intel/iosf_mbi.c | 100 +++--- block/blk-flush.c | 10 + block/blk-mq.c | 25 +- block/blk-throttle.c | 3 +- block/blk.h | 7 + block/mq-deadline.c | 19 +- drivers/acpi/acpi_lpss.c | 8 +- drivers/acpi/acpi_processor.c | 10 +- drivers/acpi/apei/ghes.c | 17 +- drivers/acpi/cppc_acpi.c | 6 +- drivers/acpi/custom_method.c | 5 +- drivers/acpi/pci_irq.c | 4 +- drivers/ata/ahci.c | 116 ++++--- drivers/ata/ahci.h | 2 + drivers/base/soc.c | 2 + drivers/block/loop.c | 1 + drivers/block/nbd.c | 4 +- drivers/char/hw_random/core.c | 2 +- drivers/char/ipmi/ipmi_msghandler.c | 114 +++---- drivers/char/mem.c | 21 ++ drivers/char/tpm/tpm-interface.c | 23 +- drivers/char/tpm/tpm_tis_core.c | 3 + drivers/cpufreq/armada-8k-cpufreq.c | 2 + drivers/cpufreq/imx-cpufreq-dt.c | 8 +- drivers/cpuidle/governors/teo.c | 32 +- drivers/devfreq/devfreq.c | 2 +- drivers/devfreq/exynos-bus.c | 31 +- drivers/devfreq/governor_passive.c | 7 +- drivers/dma/bcm2835-dma.c | 4 +- drivers/dma/iop-adma.c | 18 +- drivers/dma/ti/edma.c | 9 +- drivers/edac/altera_edac.c | 4 +- drivers/edac/amd64_edac.c | 151 ++++++---- drivers/edac/amd64_edac.h | 5 +- drivers/edac/edac_mc.c | 8 +- drivers/edac/pnd2_edac.c | 7 +- drivers/firmware/arm_scmi/driver.c | 8 + drivers/firmware/efi/cper.c | 15 + drivers/firmware/qcom_scm.c | 7 +- drivers/gpio/gpio-madera.c | 8 + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 + .../amd/display/dc/clk_mgr/dce110/dce110_clk_mgr.c | 27 +- drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c | 4 +- .../drm/amd/display/dc/dce112/dce112_resource.c | 16 +- .../drm/amd/display/dc/dce120/dce120_resource.c | 11 +- drivers/gpu/drm/amd/display/dc/inc/resource.h | 2 + drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 5 + drivers/gpu/drm/drm_kms_helper_common.c | 2 +- drivers/hwmon/acpi_power_meter.c | 4 +- drivers/hwmon/k10temp.c | 1 + drivers/i2c/busses/i2c-riic.c | 1 + drivers/infiniband/core/addr.c | 2 +- drivers/infiniband/core/uverbs_cmd.c | 3 +- drivers/infiniband/hw/hfi1/mad.c | 45 ++- drivers/infiniband/hw/hfi1/verbs.c | 17 +- drivers/infiniband/hw/mlx5/main.c | 1 + drivers/iommu/Makefile | 2 +- drivers/iommu/amd_iommu.c | 4 +- drivers/iommu/amd_iommu.h | 14 + drivers/iommu/amd_iommu_init.c | 5 +- drivers/iommu/amd_iommu_quirks.c | 92 ++++++ drivers/iommu/arm-smmu-v3.c | 2 + drivers/iommu/intel_irq_remapping.c | 6 +- drivers/iommu/iova.c | 4 +- drivers/irqchip/irq-gic-v3-its.c | 9 +- drivers/irqchip/irq-sifive-plic.c | 12 +- drivers/isdn/mISDN/socket.c | 2 + drivers/leds/led-triggers.c | 1 + drivers/leds/leds-lm3532.c | 17 +- drivers/leds/leds-lp5562.c | 6 +- drivers/md/bcache/closure.c | 10 +- drivers/md/dm-rq.c | 1 + drivers/md/md.c | 28 +- drivers/md/md.h | 3 + drivers/md/raid0.c | 33 +- drivers/md/raid0.h | 14 + drivers/md/raid1.c | 39 ++- drivers/md/raid5.c | 10 +- drivers/media/cec/cec-notifier.c | 2 + drivers/media/common/videobuf2/videobuf2-v4l2.c | 8 +- drivers/media/dvb-core/dvb_frontend.c | 4 +- drivers/media/dvb-core/dvbdev.c | 4 +- drivers/media/dvb-frontends/dvb-pll.c | 40 ++- drivers/media/i2c/ov5640.c | 5 + drivers/media/i2c/ov5645.c | 26 +- drivers/media/i2c/ov9650.c | 5 + drivers/media/i2c/tda1997x.c | 9 +- drivers/media/pci/saa7134/saa7134-i2c.c | 12 +- drivers/media/pci/saa7146/hexium_gemini.c | 3 + drivers/media/platform/aspeed-video.c | 5 +- drivers/media/platform/exynos4-is/fimc-is.c | 1 + drivers/media/platform/exynos4-is/media-dev.c | 2 + drivers/media/platform/fsl-viu.c | 2 +- drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 4 +- drivers/media/platform/omap3isp/isp.c | 8 + drivers/media/platform/omap3isp/ispccdc.c | 1 + drivers/media/platform/omap3isp/ispccp2.c | 1 + drivers/media/platform/omap3isp/ispcsi2.c | 1 + drivers/media/platform/omap3isp/isppreview.c | 1 + drivers/media/platform/omap3isp/ispresizer.c | 1 + drivers/media/platform/omap3isp/ispstat.c | 2 + drivers/media/platform/rcar_fdp1.c | 2 +- drivers/media/platform/vivid/vivid-ctrls.c | 2 +- drivers/media/platform/vivid/vivid-kthread-cap.c | 9 +- drivers/media/platform/vsp1/vsp1_dl.c | 4 +- drivers/media/radio/si470x/radio-si470x-usb.c | 5 +- drivers/media/rc/iguanair.c | 15 +- drivers/media/rc/imon.c | 7 +- drivers/media/rc/mceusb.c | 334 ++++++++++++--------- drivers/media/rc/mtk-cir.c | 8 + drivers/media/usb/cpia2/cpia2_usb.c | 4 + drivers/media/usb/dvb-usb/dib0700_devices.c | 8 + drivers/media/usb/dvb-usb/pctv452e.c | 8 - drivers/media/usb/em28xx/em28xx-cards.c | 1 - drivers/media/usb/gspca/konica.c | 5 + drivers/media/usb/gspca/nw80x.c | 5 + drivers/media/usb/gspca/ov519.c | 10 + drivers/media/usb/gspca/ov534.c | 5 + drivers/media/usb/gspca/ov534_9.c | 1 + drivers/media/usb/gspca/se401.c | 5 + drivers/media/usb/gspca/sn9c20x.c | 12 + drivers/media/usb/gspca/sonixb.c | 5 + drivers/media/usb/gspca/sonixj.c | 5 + drivers/media/usb/gspca/spca1528.c | 5 + drivers/media/usb/gspca/sq930x.c | 5 + drivers/media/usb/gspca/sunplus.c | 5 + drivers/media/usb/gspca/vc032x.c | 5 + drivers/media/usb/gspca/w996Xcf.c | 5 + drivers/media/usb/hdpvr/hdpvr-core.c | 13 +- drivers/media/usb/ttusb-dec/ttusb_dec.c | 2 +- drivers/media/v4l2-core/videobuf-core.c | 5 +- drivers/mmc/core/sdio_irq.c | 9 +- drivers/mmc/host/dw_mmc.c | 4 + drivers/mmc/host/mtk-sd.c | 3 + drivers/mmc/host/sdhci.c | 4 +- drivers/mtd/nand/raw/stm32_fmc2_nand.c | 90 ++---- drivers/net/arcnet/arcnet.c | 31 +- drivers/net/ethernet/intel/e1000e/ich8lan.c | 10 + drivers/net/ethernet/intel/e1000e/ich8lan.h | 2 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 5 + drivers/net/ethernet/marvell/skge.c | 2 +- .../ethernet/mellanox/mlx5/core/en_fs_ethtool.c | 4 +- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 89 +++--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 + drivers/net/ethernet/netronome/nfp/flower/main.c | 7 + drivers/net/ethernet/nxp/lpc_eth.c | 13 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 +- drivers/net/macsec.c | 1 + drivers/net/phy/micrel.c | 3 + drivers/net/phy/national.c | 9 +- drivers/net/ppp/ppp_generic.c | 2 + drivers/net/usb/cdc_ncm.c | 6 +- drivers/net/usb/usbnet.c | 8 + drivers/net/vrf.c | 3 +- drivers/net/wireless/ath/ath10k/wmi-tlv.c | 2 +- drivers/net/wireless/ath/ath10k/wmi-tlv.h | 16 + drivers/net/wireless/ath/ath10k/wmi.h | 8 - drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 8 +- drivers/net/wireless/marvell/libertas/if_usb.c | 3 +- drivers/net/wireless/mediatek/mt76/mmio.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 15 +- drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h | 6 +- drivers/net/wireless/mediatek/mt76/usb.c | 2 +- drivers/net/wireless/realtek/rtw88/pci.c | 71 +++-- drivers/net/wireless/zydas/zd1211rw/zd_mac.c | 1 - drivers/nvme/host/multipath.c | 8 +- drivers/nvme/target/admin-cmd.c | 14 +- drivers/parisc/dino.c | 24 ++ drivers/platform/chrome/cros_ec_rpmsg.c | 32 +- drivers/platform/x86/intel_int0002_vgpio.c | 1 + drivers/platform/x86/intel_pmc_core.c | 8 +- drivers/platform/x86/intel_pmc_core_pltdrv.c | 8 + drivers/ras/Makefile | 3 +- drivers/ras/cec.c | 1 + drivers/ras/debugfs.c | 2 + drivers/regulator/core.c | 42 ++- drivers/regulator/lm363x-regulator.c | 10 +- drivers/scsi/device_handler/scsi_dh_rdac.c | 2 + drivers/scsi/qla2xxx/qla_init.c | 25 +- drivers/scsi/qla2xxx/qla_os.c | 1 + drivers/scsi/qla2xxx/qla_target.c | 1 - drivers/scsi/scsi_lib.c | 13 + drivers/soc/amlogic/meson-clk-measure.c | 12 +- drivers/soc/renesas/Kconfig | 5 + drivers/soc/renesas/rmobile-sysc.c | 31 +- drivers/spi/spi-bcm2835.c | 14 +- drivers/spi/spi-dw-mmio.c | 6 +- drivers/spi/spi-fsl-dspi.c | 4 +- drivers/staging/erofs/zmap.c | 3 +- drivers/staging/media/hantro/hantro_drv.c | 1 + drivers/staging/media/imx/imx6-mipi-csi2.c | 12 +- drivers/staging/media/tegra-vde/Kconfig | 2 +- drivers/video/fbdev/efifb.c | 27 +- fs/binfmt_elf.c | 3 +- fs/btrfs/ctree.c | 5 +- fs/btrfs/ctree.h | 1 + fs/btrfs/delayed-inode.c | 13 +- fs/btrfs/disk-io.c | 10 + fs/btrfs/extent-tree.c | 8 + fs/btrfs/extent_io.c | 9 + fs/btrfs/free-space-cache.c | 20 +- fs/btrfs/inode.c | 8 + fs/btrfs/qgroup.c | 38 ++- fs/btrfs/tree-checker.c | 98 ++++++ fs/btrfs/volumes.c | 8 +- fs/cifs/cifsfs.c | 2 + fs/cifs/cifsglob.h | 2 + fs/cifs/connect.c | 9 +- fs/cifs/smb2ops.c | 31 +- fs/cifs/smb2pdu.c | 3 +- fs/cifs/xattr.c | 2 +- fs/ext4/extents.c | 4 +- fs/ext4/inode.c | 9 + fs/fuse/dev.c | 93 +++--- fs/fuse/file.c | 1 + fs/fuse/fuse_i.h | 3 + fs/fuse/inode.c | 1 + fs/fuse/readdir.c | 4 +- fs/gfs2/bmap.c | 1 + fs/io_uring.c | 4 +- fs/overlayfs/export.c | 3 +- fs/overlayfs/inode.c | 3 +- fs/xfs/xfs_file.c | 26 ++ include/linux/blk-mq.h | 13 + include/linux/blkdev.h | 15 +- include/linux/bug.h | 5 + include/linux/fs.h | 2 + include/linux/mmc/host.h | 9 + include/linux/pci_ids.h | 1 + include/linux/quotaops.h | 2 +- include/linux/sunrpc/xprt.h | 1 + include/net/route.h | 3 +- kernel/jump_label.c | 4 +- kernel/kprobes.c | 3 +- kernel/printk/printk.c | 2 +- kernel/rcu/tree.c | 6 +- kernel/rcu/tree_exp.h | 6 +- kernel/sched/core.c | 61 +++- kernel/sched/cpufreq_schedutil.c | 7 +- kernel/sched/deadline.c | 33 ++ kernel/sched/fair.c | 11 +- kernel/sched/idle.c | 5 +- kernel/sched/psi.c | 2 +- kernel/time/alarmtimer.c | 4 +- kernel/time/posix-cpu-timers.c | 20 +- lib/lzo/lzo1x_compress.c | 14 +- mm/compaction.c | 35 +-- mm/fadvise.c | 4 +- mm/madvise.c | 22 +- mm/memcontrol.c | 10 + mm/oom_kill.c | 5 +- mm/z3fold.c | 64 ++-- net/appletalk/ddp.c | 5 + net/ax25/af_ax25.c | 2 + net/ieee802154/socket.c | 3 + net/ipv4/inet_connection_sock.c | 4 +- net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_output.c | 2 +- net/ipv4/route.c | 36 ++- net/ipv4/tcp_bbr.c | 8 +- net/ipv4/tcp_timer.c | 5 +- net/ipv4/xfrm4_policy.c | 1 + net/ipv6/fib6_rules.c | 3 +- net/ipv6/ip6_fib.c | 2 +- net/nfc/llcp_sock.c | 7 +- net/openvswitch/datapath.c | 2 +- net/qrtr/qrtr.c | 1 + net/rds/bind.c | 5 +- net/sched/act_api.c | 34 ++- net/sched/act_sample.c | 1 + net/sched/cls_api.c | 6 +- net/sched/sch_api.c | 3 +- net/sched/sch_cbs.c | 30 +- net/sched/sch_netem.c | 2 +- net/sunrpc/clnt.c | 6 +- net/sunrpc/xdr.c | 27 +- net/sunrpc/xprt.c | 54 ++-- net/wireless/util.c | 1 + scripts/Makefile.kasan | 11 +- scripts/gcc-plugins/randomize_layout_plugin.c | 10 +- security/keys/trusted.c | 5 + sound/firewire/motu/motu.c | 12 + sound/firewire/tascam/tascam-pcm.c | 3 + sound/firewire/tascam/tascam-stream.c | 42 ++- sound/hda/hdac_controller.c | 2 + sound/i2c/other/ak4xxx-adda.c | 7 +- sound/pci/hda/hda_codec.c | 8 +- sound/pci/hda/hda_controller.c | 5 +- sound/pci/hda/hda_intel.c | 2 +- sound/pci/hda/patch_hdmi.c | 41 ++- sound/pci/hda/patch_realtek.c | 90 ++++++ sound/soc/atmel/mchp-i2s-mcc.c | 41 ++- sound/soc/codecs/es8316.c | 7 +- sound/soc/codecs/hdac_hda.c | 4 + sound/soc/codecs/sgtl5000.c | 21 +- sound/soc/codecs/tlv320aic31xx.c | 7 +- sound/soc/fsl/fsl_ssi.c | 18 +- sound/soc/generic/simple-card-utils.c | 7 + sound/soc/intel/common/sst-acpi.c | 3 +- sound/soc/intel/common/sst-ipc.c | 2 + sound/soc/intel/skylake/skl-debug.c | 2 +- sound/soc/intel/skylake/skl-nhlt.c | 2 +- sound/soc/sh/rcar/adg.c | 21 +- sound/soc/soc-generic-dmaengine-pcm.c | 6 + sound/soc/sof/intel/hda-codec.c | 6 +- sound/soc/sof/pcm.c | 27 +- sound/soc/sof/pm.c | 2 +- sound/soc/sof/sof-pci-dev.c | 3 + sound/soc/sof/sof-priv.h | 2 +- sound/soc/sunxi/sun4i-i2s.c | 9 +- sound/soc/uniphier/aio-cpu.c | 31 +- sound/soc/uniphier/aio.h | 1 + sound/usb/pcm.c | 1 + tools/include/uapi/asm/bitsperlong.h | 18 +- tools/lib/traceevent/Makefile | 6 +- tools/lib/traceevent/event-plugin.c | 2 +- tools/perf/arch/x86/util/kvm-stat.c | 4 +- tools/perf/arch/x86/util/tsc.c | 6 +- tools/perf/perf.c | 3 + tools/perf/tests/shell/trace+probe_vfs_getname.sh | 4 + tools/perf/trace/beauty/ioctl.c | 2 +- tools/perf/ui/browsers/scripts.c | 6 +- tools/perf/ui/helpline.c | 4 +- tools/perf/ui/util.c | 2 +- tools/perf/util/evlist.c | 9 + tools/perf/util/header.c | 4 +- tools/perf/util/hist.c | 5 +- tools/perf/util/map.c | 3 +- tools/perf/util/map_groups.h | 4 + tools/perf/util/thread.c | 7 +- tools/perf/util/thread.h | 4 - tools/perf/util/unwind-libunwind-local.c | 18 +- tools/perf/util/unwind-libunwind.c | 34 +-- tools/perf/util/unwind.h | 25 +- tools/perf/util/xyarray.h | 3 +- tools/power/x86/intel-speed-select/isst-config.c | 16 +- .../selftests/net/fib_nexthop_multiprefix.sh | 6 +- tools/testing/selftests/net/fib_tests.sh | 21 +- 405 files changed, 3458 insertions(+), 1712 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/344 arcnet: provide a buffer big enough to actually receive packets
From: Uwe Kleine-König <[email protected]>
[ Upstream commit 108639aac35eb57f1d0e8333f5fc8c7ff68df938 ]
struct archdr is only big enough to hold the header of various types of arcnet packets. So to provide enough space to hold the data read from hardware provide a buffer large enough to hold a packet with maximal size.
The problem was noticed by the stack protector which makes the kernel oops.
--- drivers/net/arcnet/arcnet.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-)
drivers/net/arcnet/arcnet.c +17 -14
@@ -1063,31 +1063,34 @@ EXPORT_SYMBOL(arcnet_interrupt);static void arcnet_rx (struct net_device *dev,int bufnum) {struct arcnet_local *lp =netdev_priv (dev); -struct archdr pkt; +union { +struct archdr pkt; +char buf[512 ]; + } rxdata;struct arc_rfc1201 *soft;int length, ofs; - soft = &pkt.soft.rfc1201; + soft = &rxdata.pkt.soft.rfc1201; - lp->hw.copy_from_card (dev, bufnum,0 , &pkt,ARC_HDR_SIZE ); -if (pkt.hard.offset[0 ]) { - ofs = pkt.hard.offset[0 ]; + lp->hw.copy_from_card (dev, bufnum,0 , &rxdata.pkt,ARC_HDR_SIZE ); +if (rxdata.pkt.hard.offset[0 ]) { + ofs = rxdata.pkt.hard.offset[0 ]; length =256 - ofs; }else { - ofs = pkt.hard.offset[1 ]; + ofs = rxdata.pkt.hard.offset[1 ]; length =512 - ofs; }/* get the full header, if possible */ -if (sizeof (pkt.soft) <= length) { - lp->hw.copy_from_card (dev, bufnum, ofs, soft,sizeof (pkt.soft)); +if (sizeof (rxdata.pkt.soft) <= length) { + lp->hw.copy_from_card (dev, bufnum, ofs, soft,sizeof (rxdata.pkt.soft)); }else { -memset (&pkt.soft,0 ,sizeof (pkt.soft)); +memset (&rxdata.pkt.soft,0 ,sizeof (rxdata.pkt.soft)); lp->hw.copy_from_card (dev, bufnum, ofs, soft, length); }arc_printk (D_DURING , dev,"Buffer #%d: received packet from %02Xh to %02Xh (%d+4 bytes)\n" , - bufnum, pkt.hard.source, pkt.hard.dest, length); + bufnum, rxdata.pkt.hard.source, rxdata.pkt.hard.dest, length); dev->stats.rx_packets++; dev->stats.rx_bytes += length +ARC_HDR_SIZE ;
@@ -1096,13 +1099,13 @@ static void arcnet_rx(struct net_deviceif (arc_proto_map[soft->proto]->is_ip) {if (BUGLVL (D_PROTO )) {struct ArcProto - *oldp = arc_proto_map[lp->default_proto[pkt.hard.source]], + *oldp = arc_proto_map[lp->default_proto[rxdata.pkt.hard.source]], *newp = arc_proto_map[soft->proto];if (oldp != newp) {arc_printk (D_PROTO , dev,"got protocol %02Xh; encap for host %02Xh is now '%c' (was '%c')\n" , - soft->proto, pkt.hard.source, + soft->proto, rxdata.pkt.hard.source, newp->suffix, oldp->suffix); } }
@@ -1111,10 +1114,10 @@ static void arcnet_rx(struct net_device lp->default_proto[0 ] = soft->proto;/* in striking contrast, the following isn't a hack. */ - lp->default_proto[pkt.hard.source] = soft->proto; + lp->default_proto[rxdata.pkt.hard.source] = soft->proto; }/* call the protocol-specific receiver. */ - arc_proto_map[soft->proto]->rx (dev, bufnum, &pkt, length); + arc_proto_map[soft->proto]->rx (dev, bufnum, &rxdata.pkt, length); } static void null_rx(struct net_device *dev, int bufnum,
Greg Kroah-Hartman
maintainerPATCH 2/344 cdc_ncm: fix divide-by-zero caused by invalid wMaxPacketSize
In reply to Greg Kroah-HartmanFrom: Bjørn Mork <[email protected]>
[ Upstream commit 3fe4b3351301660653a2bc73f2226da0ebd2b95e ]
Endpoints with zero wMaxPacketSize are not usable for transferring data. Ignore such endpoints when looking for valid in, out and status pipes, to make the driver more robust against invalid and meaningless descriptors.
The wMaxPacketSize of the out pipe is used as divisor. So this change fixes a divide-by-zero bug.
--- drivers/net/usb/cdc_ncm.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/usb/cdc_ncm.c +5 -1
@@ -681,8 +681,12 @@ cdc_ncm_find_endpoints(struct usbnet *deu8 ep;for (ep =0 ; ep < intf->cur_altsetting->desc.bNumEndpoints; ep++) { - e = intf->cur_altsetting->endpoint + ep; + +/* ignore endpoints which cannot transfer data */ +if (!usb_endpoint_maxp (&e->desc)) +continue ; +switch (e->desc.bmAttributes &USB_ENDPOINT_XFERTYPE_MASK ) {case USB_ENDPOINT_XFER_INT :if (usb_endpoint_dir_in (&e->desc)) {
Greg Kroah-Hartman
maintainerPATCH 3/344 ipv6: do not free rt if FIB_LOOKUP_NOREF is set on suppress rule
In reply to Greg Kroah-HartmanFrom: "Jason A. Donenfeld" <[email protected]>
[ Upstream commit ca7a03c4175366a92cee0ccc4fec0038c3266e26 ]
Commit 7d9e5f422150 removed references from certain dsts, but accounting for this never translated down into the fib6 suppression code. This bug was triggered by WireGuard users who use wg-quick(8), which uses the "suppress-prefix" directive to ip-rule(8) for routing all of their internet traffic without routing loops. The test case added here causes the reference underflow by causing packets to evaluate a suppress rule.
--- net/ipv6/fib6_rules.c | 3 ++- tools/testing/selftests/net/fib_tests.sh | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-)
net/ipv6/fib6_rules.c +2 -1
@@ -287,7 +287,8 @@ static bool fib6_rule_suppress(struct fireturn false; suppress_route: -ip6_rt_put (rt); +if (!(arg->flags &FIB_LOOKUP_NOREF )) +ip6_rt_put (rt);return true; }
tools/testing/selftests/net/fib_tests.sh +16 -1
@@ -9,7 +9,7 @@ ret=0 ksft_skip=4 # all tests in this script. Can be overridden with -t option -TESTS="unregister down carrier nexthop ipv6_rt ipv4_rt ipv6_addr_metric ipv4_addr_metric ipv6_route_metrics ipv4_route_metrics ipv4_route_v6_gw rp_filter" +TESTS="unregister down carrier nexthop suppress ipv6_rt ipv4_rt ipv6_addr_metric ipv4_addr_metric ipv6_route_metrics ipv4_route_metrics ipv4_route_v6_gw rp_filter" VERBOSE=0 PAUSE_ON_FAIL=no
@@ -614,6 +614,20 @@ fib_nexthop_test() cleanup } +fib_suppress_test() +{ + $IP link add dummy1 type dummy + $IP link set dummy1 up + $IP -6 route add default dev dummy1 + $IP -6 rule add table main suppress_prefixlength 0 + ping -f -c 1000 -W 1 1234::1 || true + $IP -6 rule del table main suppress_prefixlength 0 + $IP link del dummy1 + + # If we got here without crashing, we're good. + return 0 +} + ################################################################################ # Tests on route add and replace
@@ -1591,6 +1605,7 @@ do fib_carrier_test|carrier) fib_carrier_test;; fib_rp_filter_test|rp_filter) fib_rp_filter_test;; fib_nexthop_test|nexthop) fib_nexthop_test;; + fib_suppress_test|suppress) fib_suppress_test;; ipv6_route_test|ipv6_rt) ipv6_route_test;; ipv4_route_test|ipv4_rt) ipv4_route_test;; ipv6_addr_metric) ipv6_addr_metric_test;;
Greg Kroah-Hartman
maintainerPATCH 4/344 macsec: drop skb sk before calling gro_cells_receive
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit ba56d8ce38c8252fff5b745db3899cf092578ede ]
Fei Liu reported a crash when doing netperf on a topo of macsec dev over veth:
[ 448.919128] refcount_t: underflow; use-after-free. [ 449.090460] Call trace: [ 449.092895] refcount_sub_and_test+0xb4/0xc0 [ 449.097155] tcp_wfree+0x2c/0x150 [ 449.100460] ip_rcv+0x1d4/0x3a8 [ 449.103591] __netif_receive_skb_core+0x554/0xae0 [ 449.108282] __netif_receive_skb+0x28/0x78 [ 449.112366] netif_receive_skb_internal+0x54/0x100 [ 449.117144] napi_gro_complete+0x70/0xc0 [ 449.121054] napi_gro_flush+0x6c/0x90 [ 449.124703] napi_complete_done+0x50/0x130 [ 449.128788] gro_cell_poll+0x8c/0xa8 [ 449.132351] net_rx_action+0x16c/0x3f8 [ 449.136088] __do_softirq+0x128/0x320
The issue was caused by skb's true_size changed without its sk's sk_wmem_alloc increased in tcp/skb_gro_receive(). Later when the skb is being freed and the skb's truesize is subtracted from its sk's sk_wmem_alloc in tcp_wfree(), underflow occurs.
macsec is calling gro_cells_receive() to receive a packet, which actually requires skb->sk to be NULL. However when macsec dev is over veth, it's possible the skb->sk is still set if the skb was not unshared or expanded from the peer veth.
ip_rcv() is calling skb_orphan() to drop the skb's sk for tproxy, but it is too late for macsec's calling gro_cells_receive(). So fix it by dropping the skb's sk earlier on rx path of macsec.
--- drivers/net/macsec.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/macsec.c +1 -0
@@ -1235,6 +1235,7 @@ deliver:macsec_rxsa_put (rx_sa);macsec_rxsc_put (rx_sc); +skb_orphan (skb); ret =gro_cells_receive (&macsec->gro_cells, skb);if (ret ==NET_RX_SUCCESS )count_rx (dev, skb->len);
Greg Kroah-Hartman
maintainerPATCH 5/344 net/phy: fix DP83865 10 Mbps HDX loopback disable function
In reply to Greg Kroah-HartmanFrom: Peter Mamonov <[email protected]>
[ Upstream commit e47488b2df7f9cb405789c7f5d4c27909fc597ae ]
According to the DP83865 datasheet "the 10 Mbps HDX loopback can be disabled in the expanded memory register 0x1C0.1". The driver erroneously used bit 0 instead of bit 1.
--- drivers/net/phy/national.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/phy/national.c +6 -3
@@ -105,14 +105,17 @@ static void ns_giga_speed_fallback(strucstatic void ns_10_base_t_hdx_loopack (struct phy_device *phydev,int disable) { +u16 lb_dis =BIT (1 ); +if (disable) -ns_exp_write (phydev,0x1c0 ,ns_exp_read (phydev,0x1c0 ) |1 ); +ns_exp_write (phydev,0x1c0 , +ns_exp_read (phydev,0x1c0 ) | lb_dis);else ns_exp_write (phydev,0x1c0 , -ns_exp_read (phydev,0x1c0 ) &0xfffe ); +ns_exp_read (phydev,0x1c0 ) & ~lb_dis);pr_debug ("10BASE-T HDX loopback %s\n" , - (ns_exp_read (phydev,0x1c0 ) &0x0001 ) ?"off" :"on" ); + (ns_exp_read (phydev,0x1c0 ) & lb_dis) ?"off" :"on" ); }static int ns_config_init (struct phy_device *phydev)
Greg Kroah-Hartman
maintainerPATCH 6/344 net: qrtr: Stop rx_worker before freeing node
In reply to Greg Kroah-HartmanFrom: Bjorn Andersson <[email protected]>
[ Upstream commit 73f0c11d11329a0d6d205d4312b6e5d2512af7c5 ]
As the endpoint is unregistered there might still be work pending to handle incoming messages, which will result in a use after free scenario. The plan is to remove the rx_worker, but until then (and for stable@) ensure that the work is stopped before the node is freed.
--- net/qrtr/qrtr.c | 1 + 1 file changed, 1 insertion(+)
net/qrtr/qrtr.c +1 -0
@@ -150,6 +150,7 @@ static void __qrtr_node_release(struct klist_del (&node->item);mutex_unlock (&qrtr_node_lock); +cancel_work_sync (&node->work);skb_queue_purge (&node->rx_queue);kfree (node); }
Greg Kroah-Hartman
maintainerPATCH 7/344 net/sched: act_sample: dont push mac header on ip6gre ingress
In reply to Greg Kroah-HartmanFrom: Davide Caratti <[email protected]>
[ Upstream commit 92974a1d006ad8b30d53047c70974c9e065eb7df ]
current 'sample' action doesn't push the mac header of ingress packets if they are received by a layer 3 tunnel (like gre or sit); but it forgot to check for gre over ipv6, so the following script:
# tc q a dev $d clsact # tc f a dev $d ingress protocol ip flower ip_proto icmp action sample \
Quoted 1 line
group 100 rate 1
# psample -v -g 100
dumps everything, including outer header and mac, when $d is a gre tunnel over ipv6. Fix this adding a missing label for ARPHRD_IP6GRE devices.
--- net/sched/act_sample.c | 1 + 1 file changed, 1 insertion(+)
net/sched/act_sample.c +1 -0
@@ -146,6 +146,7 @@ static bool tcf_sample_dev_ok_push(struccase ARPHRD_TUNNEL6 :case ARPHRD_SIT :case ARPHRD_IPGRE : +case ARPHRD_IP6GRE :case ARPHRD_VOID :case ARPHRD_NONE :return false;
Greg Kroah-Hartman
maintainerPATCH 8/344 net_sched: add max len check for TCA_KIND
In reply to Greg Kroah-HartmanFrom: Cong Wang <[email protected]>
[ Upstream commit 62794fc4fbf52f2209dc094ea255eaef760e7d01 ]
The TCA_KIND attribute is of NLA_STRING which does not check the NUL char. KMSAN reported an uninit-value of TCA_KIND which is likely caused by the lack of NUL.
Change it to NLA_NUL_STRING and add a max len too.
--- net/sched/sch_api.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/sched/sch_api.c +2 -1
@@ -1390,7 +1390,8 @@ check_loop_fn(struct Qdisc *q, unsigned }const struct nla_policy rtm_tca_policy[TCA_MAX +1 ] = { - [TCA_KIND ] = { .type =NLA_STRING }, + [TCA_KIND ] = { .type =NLA_NUL_STRING , + .len =IFNAMSIZ -1 }, [TCA_RATE ] = { .type =NLA_BINARY , .len =sizeof (struct tc_estimator ) }, [TCA_STAB ] = { .type =NLA_NESTED },
Greg Kroah-Hartman
maintainerPATCH 9/344 net: stmmac: Fix page pool size
In reply to Greg Kroah-HartmanFrom: Thierry Reding <[email protected]>
[ Upstream commit 4f28bd956e081fc018fe9b41ffa31573f17bfb61 ]
The size of individual pages in the page pool in given by an order. The order is the binary logarithm of the number of pages that make up one of the pages in the pool. However, the driver currently passes the number of pages rather than the order, so it ends up wasting quite a bit of memory.
Fix this by taking the binary logarithm and passing that in the order field.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +3 -1
@@ -1532,13 +1532,15 @@ static int alloc_dma_rx_desc_resources(sfor (queue =0 ; queue < rx_count; queue++) {struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue];struct page_pool_params pp_params = {0 }; +unsigned int num_pages; rx_q->queue_index = queue; rx_q->priv_data = priv; pp_params.flags =PP_FLAG_DMA_MAP ; pp_params.pool_size =DMA_RX_SIZE ; - pp_params.order =DIV_ROUND_UP (priv->dma_buf_sz,PAGE_SIZE ); + num_pages =DIV_ROUND_UP (priv->dma_buf_sz,PAGE_SIZE ); + pp_params.order =ilog2 (num_pages); pp_params.nid =dev_to_node (priv->device); pp_params.dev = priv->device; pp_params.dma_dir =DMA_FROM_DEVICE ;
Greg Kroah-Hartman
maintainerPATCH 10/344 nfp: flower: fix memory leak in nfp_flower_spawn_vnic_reprs
In reply to Greg Kroah-HartmanFrom: Navid Emamdoost <[email protected]>
[ Upstream commit 8ce39eb5a67aee25d9f05b40b673c95b23502e3e ]
In nfp_flower_spawn_vnic_reprs in the loop if initialization or the allocations fail memory is leaked. Appropriate releases are added.
--- drivers/net/ethernet/netronome/nfp/flower/main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/netronome/nfp/flower/main.c +3 -0
@@ -400,6 +400,7 @@ nfp_flower_spawn_vnic_reprs(struct nfp_a repr_priv =kzalloc (sizeof (*repr_priv),GFP_KERNEL );if (!repr_priv) { err = -ENOMEM ; +nfp_repr_free (repr); goto err_reprs_clean; }
@@ -413,6 +414,7 @@ nfp_flower_spawn_vnic_reprs(struct nfp_a port =nfp_port_alloc (app, port_type, repr);if (IS_ERR (port)) { err =PTR_ERR (port); +kfree (repr_priv);nfp_repr_free (repr); goto err_reprs_clean; }
@@ -433,6 +435,7 @@ nfp_flower_spawn_vnic_reprs(struct nfp_a err =nfp_repr_init (app, repr, port_id, port, priv->nn->dp.netdev);if (err) { +kfree (repr_priv);nfp_port_free (port);nfp_repr_free (repr); goto err_reprs_clean;
Greg Kroah-Hartman
maintainerPATCH 11/344 nfp: flower: prevent memory leak in nfp_flower_spawn_phy_reprs
In reply to Greg Kroah-HartmanFrom: Navid Emamdoost <[email protected]>
[ Upstream commit 8572cea1461a006bce1d06c0c4b0575869125fa4 ]
In nfp_flower_spawn_phy_reprs, in the for loop over eth_tbl if any of intermediate allocations or initializations fail memory is leaked. requiered releases are added.
--- drivers/net/ethernet/netronome/nfp/flower/main.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/netronome/nfp/flower/main.c +4 -0
@@ -518,6 +518,7 @@ nfp_flower_spawn_phy_reprs(struct nfp_ap repr_priv =kzalloc (sizeof (*repr_priv),GFP_KERNEL );if (!repr_priv) { err = -ENOMEM ; +nfp_repr_free (repr); goto err_reprs_clean; }
@@ -528,11 +529,13 @@ nfp_flower_spawn_phy_reprs(struct nfp_ap port =nfp_port_alloc (app,NFP_PORT_PHYS_PORT , repr);if (IS_ERR (port)) { err =PTR_ERR (port); +kfree (repr_priv);nfp_repr_free (repr); goto err_reprs_clean; } err =nfp_port_init_phy_port (app->pf, app, port, i);if (err) { +kfree (repr_priv);nfp_port_free (port);nfp_repr_free (repr); goto err_reprs_clean;
@@ -545,6 +548,7 @@ nfp_flower_spawn_phy_reprs(struct nfp_ap err =nfp_repr_init (app, repr, cmsg_port_id, port, priv->nn->dp.netdev);if (err) { +kfree (repr_priv);nfp_port_free (port);nfp_repr_free (repr); goto err_reprs_clean;
Greg Kroah-Hartman
maintainerPATCH 12/344 openvswitch: change type of UPCALL_PID attribute to NLA_UNSPEC
In reply to Greg Kroah-HartmanFrom: Li RongQing <[email protected]>
[ Upstream commit ea8564c865299815095bebeb4b25bef474218e4c ]
userspace openvswitch patch "(dpif-linux: Implement the API functions to allow multiple handler threads read upcall)" changes its type from U32 to UNSPEC, but leave the kernel unchanged
and after kernel 6e237d099fac "(netlink: Relax attr validation for fixed length types)", this bug is exposed by the below warning
[ 57.215841] netlink: 'ovs-vswitchd': attribute type 5 has an invalid length.
--- net/openvswitch/datapath.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/openvswitch/datapath.c +1 -1
@@ -2263,7 +2263,7 @@ static const struct nla_policy vport_pol [OVS_VPORT_ATTR_STATS] = { .len = sizeof(struct ovs_vport_stats) }, [OVS_VPORT_ATTR_PORT_NO] = { .type = NLA_U32 }, [OVS_VPORT_ATTR_TYPE] = { .type = NLA_U32 }, - [OVS_VPORT_ATTR_UPCALL_PID] = { .type = NLA_U32 }, + [OVS_VPORT_ATTR_UPCALL_PID] = { .type = NLA_UNSPEC }, [OVS_VPORT_ATTR_OPTIONS] = { .type = NLA_NESTED }, [OVS_VPORT_ATTR_IFINDEX] = { .type = NLA_U32 }, [OVS_VPORT_ATTR_NETNSID] = { .type = NLA_S32 },
Greg Kroah-Hartman
maintainerPATCH 13/344 ppp: Fix memory leak in ppp_write
In reply to Greg Kroah-HartmanFrom: Takeshi Misawa <[email protected]>
[ Upstream commit 4c247de564f1ff614d11b3bb5313fb70d7b9598b ]
When ppp is closing, __ppp_xmit_process() failed to enqueue skb and skb allocated in ppp_write() is leaked.
syzbot reported :
BUG: memory leak
unreferenced object 0xffff88812a17bc00 (size 224):
comm "syz-executor673", pid 6952, jiffies 4294942888 (age 13.040s)
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:
[<00000000d110fff9>] kmemleak_alloc_recursive include/linux/kmemleak.h:43 [inline]
[<00000000d110fff9>] slab_post_alloc_hook mm/slab.h:522 [inline]
[<00000000d110fff9>] slab_alloc_node mm/slab.c:3262 [inline]
[<00000000d110fff9>] kmem_cache_alloc_node+0x163/0x2f0 mm/slab.c:3574
[<000000002d616113>] __alloc_skb+0x6e/0x210 net/core/skbuff.c:197
[<000000000167fc45>] alloc_skb include/linux/skbuff.h:1055 [inline]
[<000000000167fc45>] ppp_write+0x48/0x120 drivers/net/ppp/ppp_generic.c:502
[<000000009ab42c0b>] __vfs_write+0x43/0xa0 fs/read_write.c:494
[<00000000086b2e22>] vfs_write fs/read_write.c:558 [inline]
[<00000000086b2e22>] vfs_write+0xee/0x210 fs/read_write.c:542
[<00000000a2b70ef9>] ksys_write+0x7c/0x130 fs/read_write.c:611
[<00000000ce5e0fdd>] __do_sys_write fs/read_write.c:623 [inline]
[<00000000ce5e0fdd>] __se_sys_write fs/read_write.c:620 [inline]
[<00000000ce5e0fdd>] __x64_sys_write+0x1e/0x30 fs/read_write.c:620
[<00000000d9d7b370>] do_syscall_64+0x76/0x1a0 arch/x86/entry/common.c:296
[<0000000006e6d506>] entry_SYSCALL_64_after_hwframe+0x44/0xa9Fix this by freeing skb, if ppp is closing.
--- drivers/net/ppp/ppp_generic.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ppp/ppp_generic.c +2 -0
@@ -1415,6 +1415,8 @@ static void __ppp_xmit_process(struct ppnetif_wake_queue (ppp->dev); else netif_stop_queue(ppp->dev); + }else { +kfree_skb (skb); }ppp_xmit_unlock (ppp); }
Greg Kroah-Hartman
maintainerPATCH 14/344 sch_netem: fix a divide by zero in tabledist()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit b41d936b5ecfdb3a4abc525ce6402a6c49cffddc ]
syzbot managed to crash the kernel in tabledist() loading an empty distribution table.
t = dist->table[rnd % dist->size];
Simply return an error when such load is attempted.
--- net/sched/sch_netem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/sch_netem.c +1 -1
@@ -777,7 +777,7 @@ static int get_dist_table(struct Qdisc *struct disttable *d;int i; -if (n >NETEM_DIST_MAX ) +if (!n || n >NETEM_DIST_MAX )return -EINVAL ; d =kvmalloc (sizeof (struct disttable ) + n *sizeof (s16),GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 15/344 selftests: Update fib_tests to handle missing ping6
In reply to Greg Kroah-HartmanFrom: David Ahern <[email protected]>
[ Upstream commit 0360894a05ed52be268e3c4d40b2df9d94975fa6 ]
Some distributions (e.g., debian buster) do not install ping6. Re-use the hook in pmtu.sh to detect this and fallback to ping.
--- tools/testing/selftests/net/fib_tests.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/testing/selftests/net/fib_tests.sh +3 -1
@@ -17,6 +17,8 @@ PAUSE=no IP="ip -netns ns1" NS_EXEC="ip netns exec ns1" +which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) + log_test() { local rc=$1
@@ -1100,7 +1102,7 @@ ipv6_route_metrics_test() log_test $rc 0 "Multipath route with mtu metric" $IP -6 ro add 2001:db8:104::/64 via 2001:db8:101::2 mtu 1300 - run_cmd "ip netns exec ns1 ping6 -w1 -c1 -s 1500 2001:db8:104::1" + run_cmd "ip netns exec ns1 ${ping6} -w1 -c1 -s 1500 2001:db8:104::1" log_test $? 0 "Using route with mtu metric" run_cmd "$IP -6 ro add 2001:db8:114::/64 via 2001:db8:101::2 congctl lock foo"
Greg Kroah-Hartman
maintainerPATCH 16/344 skge: fix checksum byte order
In reply to Greg Kroah-HartmanFrom: Stephen Hemminger <[email protected]>
[ Upstream commit 5aafeb74b5bb65b34cc87c7623f9fa163a34fa3b ]
Running old skge driver on PowerPC causes checksum errors because hardware reported 1's complement checksum is in little-endian byte order.
--- drivers/net/ethernet/marvell/skge.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/marvell/skge.c +1 -1
@@ -3108,7 +3108,7 @@ static struct sk_buff *skge_rx_get(strucskb_put (skb, len);if (dev->features &NETIF_F_RXCSUM ) { - skb->csum = csum; + skb->csum =le16_to_cpu (csum); skb->ip_summed =CHECKSUM_COMPLETE ; }
Greg Kroah-Hartman
maintainerPATCH 17/344 tcp_bbr: fix quantization code to not raise cwnd if not probing bandwidth
In reply to Greg Kroah-HartmanFrom: "Kevin(Yudong) Yang" <[email protected]>
[ Upstream commit 6b3656a60f2067738d1a423328199720806f0c44 ]
There was a bug in the previous logic that attempted to ensure gain cycling gets inflight above BDP even for small BDPs. This code correctly raised and lowered target inflight values during the gain cycle. And this code correctly ensured that cwnd was raised when probing bandwidth. However, it did not correspondingly ensure that cwnd was *not* raised in this way when *not* probing for bandwidth. The result was that small-BDP flows that were always cwnd-bound could go for many cycles with a fixed cwnd, and not probe or yield bandwidth at all. This meant that multiple small-BDP flows could fail to converge in their bandwidth allocations.
--- net/ipv4/tcp_bbr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/ipv4/tcp_bbr.c +4 -4
@@ -386,7 +386,7 @@ static u32 bbr_bdp(struct sock *sk, u32* which allows 2 outstanding 2-packet sequences, to try to keep pipe * full even with ACK-every-other-packet delayed ACKs. */ -static u32 bbr_quantization_budget (struct sock *sk,u32 cwnd,int gain) +static u32 bbr_quantization_budget (struct sock *sk,u32 cwnd) {struct bbr *bbr =inet_csk_ca (sk);
@@ -397,7 +397,7 @@ static u32 bbr_quantization_budget(struc cwnd = (cwnd +1 ) & ~1U ;/* Ensure gain cycling gets inflight above BDP even for small BDPs. */ -if (bbr->mode ==BBR_PROBE_BW && gain >BBR_UNIT ) +if (bbr->mode ==BBR_PROBE_BW && bbr->cycle_idx ==0 ) cwnd +=2 ;return cwnd;
@@ -409,7 +409,7 @@ static u32 bbr_inflight(struct sock *sk,u32 inflight; inflight =bbr_bdp (sk, bw, gain); - inflight =bbr_quantization_budget (sk, inflight, gain); + inflight =bbr_quantization_budget (sk, inflight);return inflight; }
@@ -529,7 +529,7 @@ static void bbr_set_cwnd(struct sock *sk* due to aggregation (of data and/or ACKs) visible in the ACK stream. */ target_cwnd +=bbr_ack_aggregation_cwnd (sk); - target_cwnd =bbr_quantization_budget (sk, target_cwnd, gain); + target_cwnd =bbr_quantization_budget (sk, target_cwnd);/* If we're below target cwnd, slow start cwnd toward target cwnd. */ if (bbr_full_bw_reached (sk))/* only cut cwnd if we filled the pipe */
Greg Kroah-Hartman
maintainerPATCH 18/344 usbnet: ignore endpoints with invalid wMaxPacketSize
In reply to Greg Kroah-HartmanFrom: Bjørn Mork <[email protected]>
[ Upstream commit 8d3d7c2029c1b360f1a6b0a2fca470b57eb575c0 ]
Endpoints with zero wMaxPacketSize are not usable for transferring data. Ignore such endpoints when looking for valid in, out and status pipes, to make the drivers more robust against invalid and meaningless descriptors.
The wMaxPacketSize of these endpoints are used for memory allocations and as divisors in many usbnet minidrivers. Avoiding zero is therefore critical.
--- drivers/net/usb/usbnet.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/usb/usbnet.c +5 -0
@@ -100,6 +100,11 @@ int usbnet_get_endpoints(struct usbnet *int intr =0 ; e = alt->endpoint + ep; + +/* ignore endpoints which cannot transfer data */ +if (!usb_endpoint_maxp (&e->desc)) +continue ; +switch (e->desc.bmAttributes) {case USB_ENDPOINT_XFER_INT :if (!usb_endpoint_dir_in (&e->desc))
Greg Kroah-Hartman
maintainerPATCH 19/344 usbnet: sanity checking of packet sizes and device mtu
In reply to Greg Kroah-HartmanFrom: Oliver Neukum <[email protected]>
[ Upstream commit 280ceaed79f18db930c0cc8bb21f6493490bf29c ]
After a reset packet sizes and device mtu can change and need to be reevaluated to calculate queue sizes. Malicious devices can set this to zero and we divide by it. Introduce sanity checking.
--- drivers/net/usb/usbnet.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/usb/usbnet.c +3 -0
@@ -344,6 +344,8 @@ void usbnet_update_max_qlen(struct usbne {enum usb_device_speed speed = dev->udev->speed; +if (!dev->rx_urb_size || !dev->hard_mtu) + goto insanity;switch (speed) {case USB_SPEED_HIGH : dev->rx_qlen =MAX_QUEUE_MEMORY / dev->rx_urb_size;
@@ -360,6 +362,7 @@ void usbnet_update_max_qlen(struct usbne dev->tx_qlen =5 *MAX_QUEUE_MEMORY / dev->hard_mtu;break ;default : +insanity: dev->rx_qlen = dev->tx_qlen =4 ; } }
Greg Kroah-Hartman
maintainerPATCH 20/344 net/rds: Check laddr_check before calling it
In reply to Greg Kroah-HartmanFrom: Ka-Cheong Poon <[email protected]>
[ Upstream commit 05733434ee9ae6548723a808647248583e347cca ]
In rds_bind(), laddr_check is called without checking if it is NULL or not. And rs_transport should be reset if rds_add_bound() fails.
--- net/rds/bind.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/rds/bind.c +4 -1
@@ -244,7 +244,8 @@ int rds_bind(struct socket *sock, struct*/ if (rs->rs_transport) { trans = rs->rs_transport; -if (trans->laddr_check (sock_net (sock->sk), +if (!trans->laddr_check || + trans->laddr_check (sock_net (sock->sk), binding_addr, scope_id) !=0 ) { ret = -ENOPROTOOPT ; goto out;
@@ -263,6 +264,8 @@ int rds_bind(struct socket *sock, structsock_set_flag (sk,SOCK_RCU_FREE ); ret =rds_add_bound (rs, binding_addr, &port, scope_id); +if (ret) + rs->rs_transport =NULL ; out:release_sock (sk);
Greg Kroah-Hartman
maintainerPATCH 21/344 net/mlx5e: Fix matching on tunnel addresses type
In reply to Greg Kroah-HartmanFrom: Dmytro Linkin <[email protected]>
[ Upstream commit fe1587a7de94912ed75ba5ddbfabf0741f9f8239 ]
In mlx5 parse_tunnel_attr() function dispatch on encap IP address type is performed by directly checking flow_rule_match_key() on FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS, and then on FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS. However, since those are stored in union, first check is always true if any type of encap address is set, which leads to IPv6 tunnel encap address being parsed as IPv4 by mlx5. Determine correct IP address type by checking control key first and if it set, take address type from match.key->addr_type.
--- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 97 ++++++++++++++---------- 1 file changed, 57 insertions(+), 40 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +57 -40
@@ -1369,46 +1369,63 @@ static int parse_tunnel_attr(struct mlx5return err; } -if (flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS )) { -struct flow_match_ipv4_addrs match; - -flow_rule_match_enc_ipv4_addrs (rule, &match); -MLX5_SET (fte_match_set_lyr_2_4, headers_c, - src_ipv4_src_ipv6.ipv4_layout.ipv4, -ntohl (match.mask->src)); -MLX5_SET (fte_match_set_lyr_2_4, headers_v, - src_ipv4_src_ipv6.ipv4_layout.ipv4, -ntohl (match.key->src)); - -MLX5_SET (fte_match_set_lyr_2_4, headers_c, - dst_ipv4_dst_ipv6.ipv4_layout.ipv4, -ntohl (match.mask->dst)); -MLX5_SET (fte_match_set_lyr_2_4, headers_v, - dst_ipv4_dst_ipv6.ipv4_layout.ipv4, -ntohl (match.key->dst)); - -MLX5_SET_TO_ONES (fte_match_set_lyr_2_4, headers_c, ethertype); -MLX5_SET (fte_match_set_lyr_2_4, headers_v, ethertype,ETH_P_IP ); - }else if (flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS )) { -struct flow_match_ipv6_addrs match; - -flow_rule_match_enc_ipv6_addrs (rule, &match); -memcpy (MLX5_ADDR_OF (fte_match_set_lyr_2_4, headers_c, - src_ipv4_src_ipv6.ipv6_layout.ipv6), - &match.mask->src,MLX5_FLD_SZ_BYTES (ipv6_layout, ipv6)); -memcpy (MLX5_ADDR_OF (fte_match_set_lyr_2_4, headers_v, - src_ipv4_src_ipv6.ipv6_layout.ipv6), - &match.key->src,MLX5_FLD_SZ_BYTES (ipv6_layout, ipv6)); - -memcpy (MLX5_ADDR_OF (fte_match_set_lyr_2_4, headers_c, - dst_ipv4_dst_ipv6.ipv6_layout.ipv6), - &match.mask->dst,MLX5_FLD_SZ_BYTES (ipv6_layout, ipv6)); -memcpy (MLX5_ADDR_OF (fte_match_set_lyr_2_4, headers_v, - dst_ipv4_dst_ipv6.ipv6_layout.ipv6), - &match.key->dst,MLX5_FLD_SZ_BYTES (ipv6_layout, ipv6)); - -MLX5_SET_TO_ONES (fte_match_set_lyr_2_4, headers_c, ethertype); -MLX5_SET (fte_match_set_lyr_2_4, headers_v, ethertype,ETH_P_IPV6 ); +if (flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_ENC_CONTROL )) { +struct flow_match_control match; +u16 addr_type; + +flow_rule_match_enc_control (rule, &match); + addr_type = match.key->addr_type; + +/* For tunnel addr_type used same key id`s as for non-tunnel */ +if (addr_type ==FLOW_DISSECTOR_KEY_IPV4_ADDRS ) { +struct flow_match_ipv4_addrs match; + +flow_rule_match_enc_ipv4_addrs (rule, &match); +MLX5_SET (fte_match_set_lyr_2_4, headers_c, + src_ipv4_src_ipv6.ipv4_layout.ipv4, +ntohl (match.mask->src)); +MLX5_SET (fte_match_set_lyr_2_4, headers_v, + src_ipv4_src_ipv6.ipv4_layout.ipv4, +ntohl (match.key->src)); + +MLX5_SET (fte_match_set_lyr_2_4, headers_c, + dst_ipv4_dst_ipv6.ipv4_layout.ipv4, +ntohl (match.mask->dst)); +MLX5_SET (fte_match_set_lyr_2_4, headers_v, + dst_ipv4_dst_ipv6.ipv4_layout.ipv4, +ntohl (match.key->dst)); + +MLX5_SET_TO_ONES (fte_match_set_lyr_2_4, headers_c, + ethertype); +MLX5_SET (fte_match_set_lyr_2_4, headers_v, ethertype, +ETH_P_IP ); + }else if (addr_type ==FLOW_DISSECTOR_KEY_IPV6_ADDRS ) { +struct flow_match_ipv6_addrs match; + +flow_rule_match_enc_ipv6_addrs (rule, &match); +memcpy (MLX5_ADDR_OF (fte_match_set_lyr_2_4, headers_c, + src_ipv4_src_ipv6.ipv6_layout.ipv6), + &match.mask->src,MLX5_FLD_SZ_BYTES (ipv6_layout, + ipv6)); +memcpy (MLX5_ADDR_OF (fte_match_set_lyr_2_4, headers_v, + src_ipv4_src_ipv6.ipv6_layout.ipv6), + &match.key->src,MLX5_FLD_SZ_BYTES (ipv6_layout, + ipv6)); + +memcpy (MLX5_ADDR_OF (fte_match_set_lyr_2_4, headers_c, + dst_ipv4_dst_ipv6.ipv6_layout.ipv6), + &match.mask->dst,MLX5_FLD_SZ_BYTES (ipv6_layout, + ipv6)); +memcpy (MLX5_ADDR_OF (fte_match_set_lyr_2_4, headers_v, + dst_ipv4_dst_ipv6.ipv6_layout.ipv6), + &match.key->dst,MLX5_FLD_SZ_BYTES (ipv6_layout, + ipv6)); + +MLX5_SET_TO_ONES (fte_match_set_lyr_2_4, headers_c, + ethertype); +MLX5_SET (fte_match_set_lyr_2_4, headers_v, ethertype, +ETH_P_IPV6 ); + } }if (flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_ENC_IP )) {
Greg Kroah-Hartman
maintainerPATCH 22/344 ipv6: fix a typo in fib6_rule_lookup()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 7b09c2d052db4b4ad0b27b97918b46a7746966fa ]
Yi Ren reported an issue discovered by syzkaller, and bisected to the cited commit.
Many thanks to Yi, this trivial patch does not reflect the patient work that has been done.
--- net/ipv6/ip6_fib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/ip6_fib.c +1 -1
@@ -318,7 +318,7 @@ struct dst_entry *fib6_rule_lookup(strucif (rt->dst.error == -EAGAIN ) {ip6_rt_put_flags (rt, flags); rt = net->ipv6.ip6_null_entry; -if (!(flags |RT6_LOOKUP_F_DST_NOREF )) +if (!(flags &RT6_LOOKUP_F_DST_NOREF ))dst_hold (&rt->dst); }
Greg Kroah-Hartman
maintainerPATCH 23/344 selftests: Update fib_nexthop_multiprefix to handle missing ping6
In reply to Greg Kroah-HartmanFrom: David Ahern <[email protected]>
[ Upstream commit e84622ce24482f6e9c1bf29d3bdd556eb587ff41 ]
Some distributions (e.g., debian buster) do not install ping6. Re-use the hook in pmtu.sh to detect this and fallback to ping.
--- tools/testing/selftests/net/fib_nexthop_multiprefix.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
tools/testing/selftests/net/fib_nexthop_multiprefix.sh +4 -2
@@ -15,6 +15,8 @@ PAUSE_ON_FAIL=no VERBOSE=0 +which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) + ################################################################################ # helpers
@@ -200,7 +202,7 @@ validate_v6_exception() local rc if [ ${ping_sz} != "0" ]; then - run_cmd ip netns exec h0 ping6 -s ${ping_sz} -c5 -w5 ${dst} + run_cmd ip netns exec h0 ${ping6} -s ${ping_sz} -c5 -w5 ${dst} fi if [ "$VERBOSE" = "1" ]; then
@@ -243,7 +245,7 @@ do run_cmd taskset -c ${c} ip netns exec h0 ping -c1 -w1 172.16.10${i}.1 [ $? -ne 0 ] && printf "\nERROR: ping to h${i} failed\n" && ret=1 - run_cmd taskset -c ${c} ip netns exec h0 ping6 -c1 -w1 2001:db8:10${i}::1 + run_cmd taskset -c ${c} ip netns exec h0 ${ping6} -c1 -w1 2001:db8:10${i}::1 [ $? -ne 0 ] && printf "\nERROR: ping6 to h${i} failed\n" && ret=1 [ $ret -ne 0 ] && break
Greg Kroah-Hartman
maintainerPATCH 24/344 net: phy: micrel: add Asym Pause workaround for KSZ9021
In reply to Greg Kroah-HartmanFrom: Hans Andersson <[email protected]>
[ Upstream commit 407d8098cb1ab338199f4753162799a488d87d23 ]
The Micrel KSZ9031 PHY may fail to establish a link when the Asymmetric Pause capability is set. This issue is described in a Silicon Errata (DS80000691D or DS80000692D), which advises to always disable the capability.
Micrel KSZ9021 has no errata, but has the same issue with Asymmetric Pause. This patch apply the same workaround as the one for KSZ9031.
--- drivers/net/phy/micrel.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/phy/micrel.c +3 -0
@@ -763,6 +763,8 @@ static int ksz9031_get_features(struct p* Whenever the device's Asymmetric Pause capability is set to 1, * link-up may fail after a link-up to link-down transition. * +* The Errata Sheet is for ksz9031, but ksz9021 has the same issue +* * Workaround: * Do not enable the Asymmetric Pause capability bit. */
@@ -1076,6 +1078,7 @@ static struct phy_driver ksphy_driver[]/* PHY_GBIT_FEATURES */ .driver_data = &ksz9021_type, .probe = kszphy_probe, + .get_features = ksz9031_get_features, .config_init = ksz9021_config_init, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr,
Greg Kroah-Hartman
maintainerPATCH 25/344 net/sched: cbs: Fix not adding cbs instance to list
In reply to Greg Kroah-HartmanFrom: Vinicius Costa Gomes <[email protected]>
[ Upstream commit 3e8b9bfa110896f95d602d8c98d5f9d67e41d78c ]
When removing a cbs instance when offloading is enabled, the crash below can be observed.
The problem happens because that when offloading is enabled, the cbs instance is not added to the list.
Also, the current code doesn't handle correctly the case when offload is disabled without removing the qdisc: if the link speed changes the credit calculations will be wrong. When we create the cbs instance with offloading enabled, it's not added to the notification list, when later we disable offloading, it's not in the list, so link speed changes will not affect it.
The solution for both issues is the same, add the cbs instance being created unconditionally to the global list, even if the link state notification isn't useful "right now".
Crash log:
[518758.189866] BUG: kernel NULL pointer dereference, address: 0000000000000000 [518758.189870] #PF: supervisor read access in kernel mode [518758.189871] #PF: error_code(0x0000) - not-present page [518758.189872] PGD 0 P4D 0 [518758.189874] Oops: 0000 [#1] SMP PTI [518758.189876] CPU: 3 PID: 4825 Comm: tc Not tainted 5.2.9 #1 [518758.189877] Hardware name: Gigabyte Technology Co., Ltd. Z390 AORUS ULTRA/Z390 AORUS ULTRA-CF, BIOS F7 03/14/2019 [518758.189881] RIP: 0010:__list_del_entry_valid+0x29/0xa0 [518758.189883] Code: 90 48 b8 00 01 00 00 00 00 ad de 55 48 8b 17 4c 8b 47 08 48 89 e5 48 39 c2 74 27 48 b8 00 02 00 00 00 00 ad de 49 39 c0 74 2d <49> 8b 30 48 39 fe 75 3d 48 8b 52 08 48 39 f2 75 4c b8 01 00 00 00 [518758.189885] RSP: 0018:ffffa27e43903990 EFLAGS: 00010207 [518758.189887] RAX: dead000000000200 RBX: ffff8bce69f0f000 RCX: 0000000000000000 [518758.189888] RDX: 0000000000000000 RSI: ffff8bce69f0f064 RDI: ffff8bce69f0f1e0 [518758.189890] RBP: ffffa27e43903990 R08: 0000000000000000 R09: ffff8bce69e788c0 [518758.189891] R10: ffff8bce62acd400 R11: 00000000000003cb R12: ffff8bce69e78000 [518758.189892] R13: ffff8bce69f0f140 R14: 0000000000000000 R15: 0000000000000000 [518758.189894] FS: 00007fa1572c8f80(0000) GS:ffff8bce6e0c0000(0000) knlGS:0000000000000000 [518758.189895] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [518758.189896] CR2: 0000000000000000 CR3: 000000040a398006 CR4: 00000000003606e0 [518758.189898] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [518758.189899] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [518758.189900] Call Trace: [518758.189904] cbs_destroy+0x32/0xa0 [sch_cbs] [518758.189906] qdisc_destroy+0x45/0x120 [518758.189907] qdisc_put+0x25/0x30 [518758.189908] qdisc_graft+0x2c1/0x450 [518758.189910] tc_get_qdisc+0x1c8/0x310 [518758.189912] ? get_page_from_freelist+0x91a/0xcb0 [518758.189914] rtnetlink_rcv_msg+0x293/0x360 [518758.189916] ? kmem_cache_alloc_node_trace+0x178/0x260 [518758.189918] ? __kmalloc_node_track_caller+0x38/0x50 [518758.189920] ? rtnl_calcit.isra.0+0xf0/0xf0 [518758.189922] netlink_rcv_skb+0x48/0x110 [518758.189923] rtnetlink_rcv+0x10/0x20 [518758.189925] netlink_unicast+0x15b/0x1d0 [518758.189926] netlink_sendmsg+0x1ea/0x380 [518758.189929] sock_sendmsg+0x2f/0x40 [518758.189930] ___sys_sendmsg+0x295/0x2f0 [518758.189932] ? ___sys_recvmsg+0x151/0x1e0 [518758.189933] ? do_wp_page+0x7e/0x450 [518758.189935] __sys_sendmsg+0x48/0x80 [518758.189937] __x64_sys_sendmsg+0x1a/0x20 [518758.189939] do_syscall_64+0x53/0x1f0 [518758.189941] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [518758.189942] RIP: 0033:0x7fa15755169a [518758.189944] Code: 48 c7 c0 ff ff ff ff eb be 0f 1f 80 00 00 00 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 18 b8 2e 00 00 00 c5 fc 77 0f 05 <48> 3d 00 f0 ff ff 77 5e c3 0f 1f 44 00 00 48 83 ec 28 89 54 24 1c [518758.189946] RSP: 002b:00007ffda58b60b8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e [518758.189948] RAX: ffffffffffffffda RBX: 000055e4b836d9a0 RCX: 00007fa15755169a [518758.189949] RDX: 0000000000000000 RSI: 00007ffda58b6128 RDI: 0000000000000003 [518758.189951] RBP: 00007ffda58b6190 R08: 0000000000000001 R09: 000055e4b9d848a0 [518758.189952] R10: 0000000000000000 R11: 0000000000000246 R12: 000000005d654b49 [518758.189953] R13: 0000000000000000 R14: 00007ffda58b6230 R15: 00007ffda58b6210 [518758.189955] Modules linked in: sch_cbs sch_etf sch_mqprio netlink_diag unix_diag e1000e igb intel_pch_thermal thermal video backlight pcc_cpufreq [518758.189960] CR2: 0000000000000000 [518758.189961] ---[ end trace 6a13f7aaf5376019 ]--- [518758.189963] RIP: 0010:__list_del_entry_valid+0x29/0xa0 [518758.189964] Code: 90 48 b8 00 01 00 00 00 00 ad de 55 48 8b 17 4c 8b 47 08 48 89 e5 48 39 c2 74 27 48 b8 00 02 00 00 00 00 ad de 49 39 c0 74 2d <49> 8b 30 48 39 fe 75 3d 48 8b 52 08 48 39 f2 75 4c b8 01 00 00 00 [518758.189967] RSP: 0018:ffffa27e43903990 EFLAGS: 00010207 [518758.189968] RAX: dead000000000200 RBX: ffff8bce69f0f000 RCX: 0000000000000000 [518758.189969] RDX: 0000000000000000 RSI: ffff8bce69f0f064 RDI: ffff8bce69f0f1e0 [518758.189971] RBP: ffffa27e43903990 R08: 0000000000000000 R09: ffff8bce69e788c0 [518758.189972] R10: ffff8bce62acd400 R11: 00000000000003cb R12: ffff8bce69e78000 [518758.189973] R13: ffff8bce69f0f140 R14: 0000000000000000 R15: 0000000000000000 [518758.189975] FS: 00007fa1572c8f80(0000) GS:ffff8bce6e0c0000(0000) knlGS:0000000000000000 [518758.189976] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [518758.189977] CR2: 0000000000000000 CR3: 000000040a398006 CR4: 00000000003606e0 [518758.189979] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [518758.189980] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
--- net/sched/sch_cbs.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-)
net/sched/sch_cbs.c +13 -17
@@ -392,7 +392,6 @@ static int cbs_init(struct Qdisc *sch, s {struct cbs_sched_data *q =qdisc_priv (sch);struct net_device *dev =qdisc_dev (sch); -int err;if (!opt) {NL_SET_ERR_MSG (extack,"Missing CBS qdisc options which are mandatory" );
@@ -404,6 +403,10 @@ static int cbs_init(struct Qdisc *sch, sif (!q->qdisc)return -ENOMEM ; +spin_lock (&cbs_list_lock); +list_add (&q->cbs_list, &cbs_list); +spin_unlock (&cbs_list_lock); +qdisc_hash_add (q->qdisc, false); q->queue = sch->dev_queue -netdev_get_tx_queue (dev,0 );
@@ -413,17 +416,7 @@ static int cbs_init(struct Qdisc *sch, sqdisc_watchdog_init (&q->watchdog, sch); - err =cbs_change (sch, opt, extack); -if (err) -return err; - -if (!q->offload) { -spin_lock (&cbs_list_lock); -list_add (&q->cbs_list, &cbs_list); -spin_unlock (&cbs_list_lock); - } - -return 0 ; +return cbs_change (sch, opt, extack); }static void cbs_destroy (struct Qdisc *sch)
@@ -431,15 +424,18 @@ static void cbs_destroy(struct Qdisc *scstruct cbs_sched_data *q =qdisc_priv (sch);struct net_device *dev =qdisc_dev (sch); -spin_lock (&cbs_list_lock); -list_del (&q->cbs_list); -spin_unlock (&cbs_list_lock); +/* Nothing to do if we couldn't create the underlying qdisc */ +if (!q->qdisc) +return ;qdisc_watchdog_cancel (&q->watchdog);cbs_disable_offload (dev, q); -if (q->qdisc) -qdisc_put (q->qdisc); +spin_lock (&cbs_list_lock); +list_del (&q->cbs_list); +spin_unlock (&cbs_list_lock); + +qdisc_put (q->qdisc); }static int cbs_dump (struct Qdisc *sch,struct sk_buff *skb)
Greg Kroah-Hartman
maintainerPATCH 26/344 ipv4: Revert removal of rt_uses_gateway
In reply to Greg Kroah-HartmanFrom: David Ahern <[email protected]>
[ Upstream commit 77d5bc7e6a6cf8bbeca31aab7f0c5449a5eee762 ]
Julian noted that rt_uses_gateway has a more subtle use than 'is gateway set':
https://lore.kernel.org/netdev/[email protected]/
Revert that part of the commit referenced in the Fixes tag.
Currently, there are no u8 holes in 'struct rtable'. There is a 4-byte hole in the second cacheline which contains the gateway declaration. So move rt_gw_family down to the gateway declarations since they are always used together, and then re-use that u8 for rt_uses_gateway. End result is that rtable size is unchanged.
--- drivers/infiniband/core/addr.c | 2 +- include/net/route.h | 3 ++- net/ipv4/inet_connection_sock.c | 4 ++-- net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_output.c | 2 +- net/ipv4/route.c | 36 +++++++++++++++++++++--------------- net/ipv4/xfrm4_policy.c | 1 + 7 files changed, 29 insertions(+), 21 deletions(-)
drivers/infiniband/core/addr.c +1 -1
@@ -352,7 +352,7 @@ static bool has_gateway(const struct dstif (family ==AF_INET ) { rt = container_of(dst, struct rtable, dst); -return rt->rt_gw_family ==AF_INET ; +return rt->rt_uses_gateway; } rt6 = container_of(dst, struct rt6_info, dst);
include/net/route.h +2 -1
@@ -53,10 +53,11 @@ struct rtable {unsigned int rt_flags;__u16 rt_type;__u8 rt_is_input; -u8 rt_gw_family; +__u8 rt_uses_gateway;int rt_iif; +u8 rt_gw_family;/* Info on neighbour */ union {__be32 rt_gw4;
net/ipv4/inet_connection_sock.c +2 -2
@@ -560,7 +560,7 @@ struct dst_entry *inet_csk_route_req(con rt =ip_route_output_flow (net, fl4, sk);if (IS_ERR (rt)) goto no_route; -if (opt && opt->opt.is_strictroute && rt->rt_gw_family) +if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway) goto route_err;rcu_read_unlock ();return &rt->dst;
@@ -598,7 +598,7 @@ struct dst_entry *inet_csk_route_child_s rt =ip_route_output_flow (net, fl4, sk);if (IS_ERR (rt)) goto no_route; -if (opt && opt->opt.is_strictroute && rt->rt_gw_family) +if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway) goto route_err;return &rt->dst;
net/ipv4/ip_forward.c +1 -1
@@ -123,7 +123,7 @@ int ip_forward(struct sk_buff *skb) rt =skb_rtable (skb); -if (opt->is_strictroute && rt->rt_gw_family) +if (opt->is_strictroute && rt->rt_uses_gateway) goto sr_failed;IPCB (skb)->flags |=IPSKB_FORWARDED ;
net/ipv4/ip_output.c +1 -1
@@ -499,7 +499,7 @@ int __ip_queue_xmit(struct sock *sk, strskb_dst_set_noref (skb, &rt->dst); packet_routed: -if (inet_opt && inet_opt->opt.is_strictroute && rt->rt_gw_family) +if (inet_opt && inet_opt->opt.is_strictroute && rt->rt_uses_gateway) goto no_route;/* OK, we know where to send it, allocate and build IP header. */
net/ipv4/route.c +21 -15
@@ -635,6 +635,7 @@ static void fill_route_from_fnhe(structif (fnhe->fnhe_gw) { rt->rt_flags |=RTCF_REDIRECTED ; + rt->rt_uses_gateway =1 ; rt->rt_gw_family =AF_INET ; rt->rt_gw4 = fnhe->fnhe_gw; }
@@ -1313,7 +1314,7 @@ static unsigned int ipv4_mtu(const struc mtu =READ_ONCE (dst->dev->mtu);if (unlikely (ip_mtu_locked (dst))) { -if (rt->rt_gw_family && mtu >576 ) +if (rt->rt_uses_gateway && mtu >576 ) mtu =576 ; }
@@ -1569,6 +1570,7 @@ static void rt_set_nexthop(struct rtablestruct fib_nh_common *nhc =FIB_RES_NHC (*res);if (nhc->nhc_gw_family && nhc->nhc_scope ==RT_SCOPE_LINK ) { + rt->rt_uses_gateway =1 ; rt->rt_gw_family = nhc->nhc_gw_family;/* only INET and INET6 are supported */ if (likely (nhc->nhc_gw_family ==AF_INET ))
@@ -1634,6 +1636,7 @@ struct rtable *rt_dst_alloc(struct net_d rt->rt_iif =0 ; rt->rt_pmtu =0 ; rt->rt_mtu_locked =0 ; + rt->rt_uses_gateway =0 ; rt->rt_gw_family =0 ; rt->rt_gw4 =0 ;INIT_LIST_HEAD (&rt->rt_uncached);
@@ -2694,6 +2697,7 @@ struct dst_entry *ipv4_blackhole_route(s rt->rt_genid =rt_genid_ipv4 (net); rt->rt_flags = ort->rt_flags; rt->rt_type = ort->rt_type; + rt->rt_uses_gateway = ort->rt_uses_gateway; rt->rt_gw_family = ort->rt_gw_family;if (rt->rt_gw_family ==AF_INET ) rt->rt_gw4 = ort->rt_gw4;
@@ -2778,21 +2782,23 @@ static int rt_fill_info(struct net *net,if (nla_put_in_addr (skb,RTA_PREFSRC , fl4->saddr)) goto nla_put_failure; } -if (rt->rt_gw_family ==AF_INET && -nla_put_in_addr (skb,RTA_GATEWAY , rt->rt_gw4)) { - goto nla_put_failure; - }else if (rt->rt_gw_family ==AF_INET6 ) { -int alen =sizeof (struct in6_addr ); -struct nlattr *nla; -struct rtvia *via; - - nla =nla_reserve (skb,RTA_VIA , alen +2 ); -if (!nla) +if (rt->rt_uses_gateway) { +if (rt->rt_gw_family ==AF_INET && +nla_put_in_addr (skb,RTA_GATEWAY , rt->rt_gw4)) { goto nla_put_failure; - - via =nla_data (nla); - via->rtvia_family =AF_INET6 ; -memcpy (via->rtvia_addr, &rt->rt_gw6, alen); + }else if (rt->rt_gw_family ==AF_INET6 ) { +int alen =sizeof (struct in6_addr ); +struct nlattr *nla; +struct rtvia *via; + + nla =nla_reserve (skb,RTA_VIA , alen +2 ); +if (!nla) + goto nla_put_failure; + + via =nla_data (nla); + via->rtvia_family =AF_INET6 ; +memcpy (via->rtvia_addr, &rt->rt_gw6, alen); + } } expires = rt->dst.expires;
net/ipv4/xfrm4_policy.c +1 -0
@@ -85,6 +85,7 @@ static int xfrm4_fill_dst(struct xfrm_ds xdst->u.rt.rt_flags = rt->rt_flags & (RTCF_BROADCAST |RTCF_MULTICAST |RTCF_LOCAL ); xdst->u.rt.rt_type = rt->rt_type; + xdst->u.rt.rt_uses_gateway = rt->rt_uses_gateway; xdst->u.rt.rt_gw_family = rt->rt_gw_family;if (rt->rt_gw_family ==AF_INET ) xdst->u.rt.rt_gw4 = rt->rt_gw4;
Greg Kroah-Hartman
maintainerPATCH 27/344 net_sched: add policy validation for action attributes
In reply to Greg Kroah-HartmanFrom: Cong Wang <[email protected]>
[ Upstream commit 199ce850ce112315cfc68d42b694bcaa27b097b7 ]
Similar to commit 8b4c3cdd9dd8
("net: sched: Add policy validation for tc attributes"), we need to add proper policy validation for TC action attributes too.
--- net/sched/act_api.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-)
net/sched/act_api.c +18 -16
@@ -831,6 +831,15 @@ static struct tc_cookie *nla_memdup_cookreturn c; } +static const struct nla_policy tcf_action_policy[TCA_ACT_MAX +1 ] = { + [TCA_ACT_KIND ] = { .type =NLA_NUL_STRING , + .len =IFNAMSIZ -1 }, + [TCA_ACT_INDEX ] = { .type =NLA_U32 }, + [TCA_ACT_COOKIE ] = { .type =NLA_BINARY , + .len =TC_COOKIE_MAX_SIZE }, + [TCA_ACT_OPTIONS ] = { .type =NLA_NESTED }, +}; + struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp, struct nlattr *nla, struct nlattr *est, char *name, int ovr, int bind,
@@ -846,8 +855,8 @@ struct tc_action *tcf_action_init_1(struint err;if (name ==NULL ) { - err =nla_parse_nested_deprecated (tb,TCA_ACT_MAX , nla,NULL , - extack); + err =nla_parse_nested_deprecated (tb,TCA_ACT_MAX , nla, + tcf_action_policy, extack);if (err <0 ) goto err_out; err = -EINVAL ;
@@ -856,18 +865,9 @@ struct tc_action *tcf_action_init_1(struNL_SET_ERR_MSG (extack,"TC action kind must be specified" ); goto err_out; } -if (nla_strlcpy (act_name, kind,IFNAMSIZ ) >=IFNAMSIZ ) { -NL_SET_ERR_MSG (extack,"TC action name too long" ); - goto err_out; - } -if (tb[TCA_ACT_COOKIE ]) { -int cklen =nla_len (tb[TCA_ACT_COOKIE ]); - -if (cklen >TC_COOKIE_MAX_SIZE ) { -NL_SET_ERR_MSG (extack,"TC cookie size above the maximum" ); - goto err_out; - } +nla_strlcpy (act_name, kind,IFNAMSIZ ); +if (tb[TCA_ACT_COOKIE ]) { cookie =nla_memdup_cookie (tb);if (!cookie) {NL_SET_ERR_MSG (extack,"No memory to generate TC cookie" );
@@ -1098,7 +1098,8 @@ static struct tc_action *tcf_action_get_int index;int err; - err =nla_parse_nested_deprecated (tb,TCA_ACT_MAX , nla,NULL , extack); + err =nla_parse_nested_deprecated (tb,TCA_ACT_MAX , nla, + tcf_action_policy, extack);if (err <0 ) goto err_out;
@@ -1152,7 +1153,8 @@ static int tca_action_flush(struct net * b =skb_tail_pointer (skb); - err =nla_parse_nested_deprecated (tb,TCA_ACT_MAX , nla,NULL , extack); + err =nla_parse_nested_deprecated (tb,TCA_ACT_MAX , nla, + tcf_action_policy, extack);if (err <0 ) goto err_out;
@@ -1440,7 +1442,7 @@ static struct nlattr *find_dump_kind(strif (tb[1 ] ==NULL )return NULL ; -if (nla_parse_nested_deprecated (tb2,TCA_ACT_MAX , tb[1 ],NULL ,NULL ) <0 ) +if (nla_parse_nested_deprecated (tb2,TCA_ACT_MAX , tb[1 ], tcf_action_policy,NULL ) <0 )return NULL ; kind = tb2[TCA_ACT_KIND ];
Greg Kroah-Hartman
maintainerPATCH 28/344 vrf: Do not attempt to create IPv6 mcast rule if IPv6 is disabled
In reply to Greg Kroah-HartmanFrom: David Ahern <[email protected]>
[ Upstream commit dac91170f8e9c73784af5fad6225e954b795601c ]
A user reported that vrf create fails when IPv6 is disabled at boot using 'ipv6.disable=1':
https://bugzilla.kernel.org/show_bug.cgi?id=204903
The failure is adding fib rules at create time. Add RTNL_FAMILY_IP6MR to the check in vrf_fib_rule if ipv6_mod_enabled is disabled.
--- drivers/net/vrf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/vrf.c +2 -1
@@ -1154,7 +1154,8 @@ static int vrf_fib_rule(const struct netstruct sk_buff *skb;int err; -if (family ==AF_INET6 && !ipv6_mod_enabled ()) +if ((family ==AF_INET6 || family ==RTNL_FAMILY_IP6MR ) && + !ipv6_mod_enabled ())return 0 ; skb =nlmsg_new (vrf_fib_rule_nl_size (),GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 29/344 net/mlx5e: Fix traffic duplication in ethtool steering
In reply to Greg Kroah-HartmanFrom: Saeed Mahameed <[email protected]>
[ Upstream commit d22fcc806b84b9818de08b32e494f3c05dd236c7 ]
Before this patch, when adding multiple ethtool steering rules with identical classification, the driver used to append the new destination to the already existing hw rule, which caused the hw to forward the traffic to all destinations (rx queues).
Here we avoid this by setting the "no append" mlx5 fs core flag when adding a new ethtool rule.
--- drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c +2 -2
@@ -399,10 +399,10 @@ add_ethtool_flow_rule(struct mlx5e_privstruct mlx5_flow_table *ft, struct ethtool_rx_flow_spec *fs) { + struct mlx5_flow_act flow_act = { .flags = FLOW_ACT_NO_APPEND };struct mlx5_flow_destination *dst =NULL ; -struct mlx5_flow_act flow_act = {0 }; -struct mlx5_flow_spec *spec;struct mlx5_flow_handle *rule; +struct mlx5_flow_spec *spec;int err =0 ; spec =kvzalloc (sizeof (*spec),GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 30/344 net: sched: fix possible crash in tcf_action_destroy()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 3d66b89c30f9220a72e92847768fc8ba4d027d88 ]
If the allocation done in tcf_exts_init() failed,
we end up with a NULL pointer in exts->actions.
kasan: GPF could be caused by NULL-ptr deref or user memory access
general protection fault: 0000 [#1] PREEMPT SMP KASAN CPU: 1 PID: 8198 Comm: syz-executor.3 Not tainted 5.3.0-rc8+ #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:tcf_action_destroy+0x71/0x160 net/sched/act_api.c:705 Code: c3 08 44 89 ee e8 4f cb bb fb 41 83 fd 20 0f 84 c9 00 00 00 e8 c0 c9 bb fb 48 89 d8 48 b9 00 00 00 00 00 fc ff df 48 c1 e8 03 <80> 3c 08 00 0f 85 c0 00 00 00 4c 8b 33 4d 85 f6 0f 84 9d 00 00 00 RSP: 0018:ffff888096e16ff0 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000000 RCX: dffffc0000000000 RDX: 0000000000040000 RSI: ffffffff85b6ab30 RDI: 0000000000000000 RBP: ffff888096e17020 R08: ffff8880993f6140 R09: fffffbfff11cae67 R10: fffffbfff11cae66 R11: ffffffff88e57333 R12: 0000000000000000 R13: 0000000000000000 R14: ffff888096e177a0 R15: 0000000000000001 FS: 00007f62bc84a700(0000) GS:ffff8880ae900000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000758040 CR3: 0000000088b64000 CR4: 00000000001426e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: tcf_exts_destroy+0x38/0xb0 net/sched/cls_api.c:3030 tcindex_set_parms+0xf7f/0x1e50 net/sched/cls_tcindex.c:488 tcindex_change+0x230/0x318 net/sched/cls_tcindex.c:519 tc_new_tfilter+0xa4b/0x1c70 net/sched/cls_api.c:2152 rtnetlink_rcv_msg+0x838/0xb00 net/core/rtnetlink.c:5214 netlink_rcv_skb+0x177/0x450 net/netlink/af_netlink.c:2477 rtnetlink_rcv+0x1d/0x30 net/core/rtnetlink.c:5241 netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline] netlink_unicast+0x531/0x710 net/netlink/af_netlink.c:1328 netlink_sendmsg+0x8a5/0xd60 net/netlink/af_netlink.c:1917 sock_sendmsg_nosec net/socket.c:637 [inline] sock_sendmsg+0xd7/0x130 net/socket.c:657 ___sys_sendmsg+0x3e2/0x920 net/socket.c:2311 __sys_sendmmsg+0x1bf/0x4d0 net/socket.c:2413 __do_sys_sendmmsg net/socket.c:2442 [inline]
--- net/sched/cls_api.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/sched/cls_api.c +4 -2
@@ -3027,8 +3027,10 @@ out:void tcf_exts_destroy (struct tcf_exts *exts) {#ifdef CONFIG_NET_CLS_ACT -tcf_action_destroy (exts->actions,TCA_ACT_UNBIND ); -kfree (exts->actions); +if (exts->actions) { +tcf_action_destroy (exts->actions,TCA_ACT_UNBIND ); +kfree (exts->actions); + } exts->nr_actions =0 ;#endif }
Greg Kroah-Hartman
maintainerPATCH 31/344 tcp: better handle TCP_USER_TIMEOUT in SYN_SENT state
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit a66b10c05ee2d744189e9a2130394b070883d289 ]
Yuchung Cheng and Marek Majkowski independently reported a weird behavior of TCP_USER_TIMEOUT option when used at connect() time.
When the TCP_USER_TIMEOUT is reached, tcp_write_timeout() believes the flow should live, and the following condition in tcp_clamp_rto_to_user_timeout() programs one jiffie timers :
remaining = icsk->icsk_user_timeout - elapsed;
if (remaining <= 0)
return 1; /* user timeout has passed; fire ASAP */This silly situation ends when the max syn rtx count is reached.
This patch makes sure we honor both TCP_SYNCNT and TCP_USER_TIMEOUT, avoiding these spurious SYN packets.
--- net/ipv4/tcp_timer.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/ipv4/tcp_timer.c +3 -2
@@ -210,7 +210,7 @@ static int tcp_write_timeout(struct sockstruct inet_connection_sock *icsk =inet_csk (sk);struct tcp_sock *tp =tcp_sk (sk);struct net *net =sock_net (sk); -bool expired, do_reset; +bool expired = false, do_reset;int retry_until;if ((1 << sk->sk_state) & (TCPF_SYN_SENT |TCPF_SYN_RECV )) {
@@ -242,9 +242,10 @@ static int tcp_write_timeout(struct sockif (tcp_out_of_resources (sk, do_reset))return 1 ; } + } +if (!expired) expired =retransmits_timed_out (sk, retry_until, icsk->icsk_user_timeout); - }tcp_fastopen_active_detect_blackhole (sk, expired);if (BPF_SOCK_OPS_TEST_FLAG (tp,BPF_SOCK_OPS_RTO_CB_FLAG ))
Greg Kroah-Hartman
maintainerPATCH 32/344 net/mlx5: Add device ID of upcoming BlueField-2
In reply to Greg Kroah-HartmanFrom: Bodong Wang <[email protected]>
[ Upstream commit d19a79ee38c8fda6d297e4227e80db8bf51c71a6 ]
Add the device ID of upcoming BlueField-2 integrated ConnectX-6 Dx network controller. Its VFs will be using the generic VF device ID:0x101e "ConnectX Family mlx5Gen Virtual Function".
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/main.c +1 -0
@@ -1554,6 +1554,7 @@ static const struct pci_device_id mlx5_c { PCI_VDEVICE(MELLANOX, 0x101e), MLX5_PCI_DEV_IS_VF}, /* ConnectX Family mlx5Gen Virtual Function */ { PCI_VDEVICE(MELLANOX, 0xa2d2) }, /* BlueField integrated ConnectX-5 network controller */ { PCI_VDEVICE(MELLANOX, 0xa2d3), MLX5_PCI_DEV_IS_VF}, /* BlueField integrated ConnectX-5 network controller VF */ + { PCI_VDEVICE(MELLANOX, 0xa2d6) }, /* BlueField-2 integrated ConnectX-6 Dx network controller */ { 0, } };
Greg Kroah-Hartman
maintainerPATCH 33/344 mISDN: enforce CAP_NET_RAW for raw sockets
In reply to Greg Kroah-HartmanFrom: Ori Nimron <[email protected]>
[ Upstream commit b91ee4aa2a2199ba4d4650706c272985a5a32d80 ]
When creating a raw AF_ISDN socket, CAP_NET_RAW needs to be checked first.
--- drivers/isdn/mISDN/socket.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/isdn/mISDN/socket.c +2 -0
@@ -754,6 +754,8 @@ base_sock_create(struct net *net, structif (sock->type !=SOCK_RAW )return -ESOCKTNOSUPPORT ; +if (!capable (CAP_NET_RAW )) +return -EPERM ; sk =sk_alloc (net,PF_ISDN ,GFP_KERNEL , &mISDN_proto, kern);if (!sk)
Greg Kroah-Hartman
maintainerPATCH 34/344 appletalk: enforce CAP_NET_RAW for raw sockets
In reply to Greg Kroah-HartmanFrom: Ori Nimron <[email protected]>
[ Upstream commit 6cc03e8aa36c51f3b26a0d21a3c4ce2809c842ac ]
When creating a raw AF_APPLETALK socket, CAP_NET_RAW needs to be checked first.
--- net/appletalk/ddp.c | 5 +++++ 1 file changed, 5 insertions(+)
net/appletalk/ddp.c +5 -0
@@ -1023,6 +1023,11 @@ static int atalk_create(struct net *net,*/ if (sock->type !=SOCK_RAW && sock->type !=SOCK_DGRAM ) goto out; + + rc = -EPERM ; +if (sock->type ==SOCK_RAW && !kern && !capable (CAP_NET_RAW )) + goto out; + rc = -ENOMEM ; sk =sk_alloc (net,PF_APPLETALK ,GFP_KERNEL , &ddp_proto, kern);if (!sk)
Greg Kroah-Hartman
maintainerPATCH 35/344 ax25: enforce CAP_NET_RAW for raw sockets
In reply to Greg Kroah-HartmanFrom: Ori Nimron <[email protected]>
[ Upstream commit 0614e2b73768b502fc32a75349823356d98aae2c ]
When creating a raw AF_AX25 socket, CAP_NET_RAW needs to be checked first.
--- net/ax25/af_ax25.c | 2 ++ 1 file changed, 2 insertions(+)
net/ax25/af_ax25.c +2 -0
@@ -855,6 +855,8 @@ static int ax25_create(struct net *net,break ;case SOCK_RAW : +if (!capable (CAP_NET_RAW )) +return -EPERM ;break ;default :return -ESOCKTNOSUPPORT ;
Greg Kroah-Hartman
maintainerPATCH 36/344 ieee802154: enforce CAP_NET_RAW for raw sockets
In reply to Greg Kroah-HartmanFrom: Ori Nimron <[email protected]>
[ Upstream commit e69dbd4619e7674c1679cba49afd9dd9ac347eef ]
When creating a raw AF_IEEE802154 socket, CAP_NET_RAW needs to be checked first.
--- net/ieee802154/socket.c | 3 +++ 1 file changed, 3 insertions(+)
net/ieee802154/socket.c +3 -0
@@ -1008,6 +1008,9 @@ static int ieee802154_create(struct netswitch (sock->type) {case SOCK_RAW : + rc = -EPERM ; +if (!capable (CAP_NET_RAW )) + goto out; proto = &ieee802154_raw_prot; ops = &ieee802154_raw_ops;break ;
Greg Kroah-Hartman
maintainerPATCH 37/344 nfc: enforce CAP_NET_RAW for raw sockets
In reply to Greg Kroah-HartmanFrom: Ori Nimron <[email protected]>
[ Upstream commit 3a359798b176183ef09efb7a3dc59abad1cc7104 ]
When creating a raw AF_NFC socket, CAP_NET_RAW needs to be checked first.
--- net/nfc/llcp_sock.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/nfc/llcp_sock.c +5 -2
@@ -1004,10 +1004,13 @@ static int llcp_sock_create(struct net * sock->type != SOCK_RAW)return -ESOCKTNOSUPPORT ; -if (sock->type ==SOCK_RAW ) +if (sock->type ==SOCK_RAW ) { +if (!capable (CAP_NET_RAW )) +return -EPERM ; sock->ops = &llcp_rawsock_ops; -else + }else { sock->ops = &llcp_sock_ops; + } sk =nfc_llcp_sock_alloc (sock, sock->type,GFP_ATOMIC , kern);if (sk ==NULL )
Greg Kroah-Hartman
maintainerPATCH 38/344 ALSA: hda: Flush interrupts on disabling
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
[ Upstream commit caa8422d01e983782548648e125fd617cadcec3f ]
I was looking at
<4> [241.835158] general protection fault: 0000 [#1] PREEMPT SMP PTI
<4> [241.835181] CPU: 1 PID: 214 Comm: kworker/1:3 Tainted: G U 5.2.0-CI-CI_DRM_6509+ #1
<4> [241.835199] Hardware name: Dell Inc. OptiPlex 745 /0GW726, BIOS 2.3.1 05/21/2007
<4> [241.835234] Workqueue: events snd_hdac_bus_process_unsol_events [snd_hda_core]
<4> [241.835256] RIP: 0010:input_handle_event+0x16d/0x5e0
<4> [241.835270] Code: 48 8b 93 58 01 00 00 8b 52 08 89 50 04 8b 83 f8 06 00 00 48 8b 93 00 07 00 00 8d 70 01 48 8d 04 c2 83 e1 08 89 b3 f8 06 00 00 <66> 89 28 66 44 89 60 02 44 89 68 04 8b 93 f8 06 00 00 0f 84 fd fe <4> [241.835304] RSP: 0018:ffffc9000019fda0 EFLAGS: 00010046
<4> [241.835317] RAX: 6b6b6b6ec6c6c6c3 RBX: ffff8880290fefc8 RCX: 0000000000000000
<4> [241.835332] RDX: 000000006b6b6b6b RSI: 000000006b6b6b6c RDI: 0000000000000046
<4> [241.835347] RBP: 0000000000000005 R08: 0000000000000000 R09: 0000000000000001
<4> [241.835362] R10: ffffc9000019faa0 R11: 0000000000000000 R12: 0000000000000004
<4> [241.835377] R13: 0000000000000000 R14: ffff8880290ff1d0 R15: 0000000000000293
<4> [241.835392] FS: 0000000000000000(0000) GS:ffff88803de80000(0000) knlGS:0000000000000000
<4> [241.835409] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
<4> [241.835422] CR2: 00007ffe9a99e9b7 CR3: 000000002f588000 CR4: 00000000000006e0
<4> [241.835436] Call Trace:
<4> [241.835449] input_event+0x45/0x70 <4> [241.835464] snd_jack_report+0xdc/0x100 <4> [241.835490] snd_hda_jack_report_sync+0x83/0xc0 [snd_hda_codec] <4> [241.835512] snd_hdac_bus_process_unsol_events+0x5a/0x70 [snd_hda_core] <4> [241.835530] process_one_work+0x245/0x610
which has the hallmarks of a worker queued from interrupt after it was supposedly cancelled (note the POISON_FREE), and I could not see where the interrupt would be flushed on shutdown so added the likely suspects.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111174
--- sound/hda/hdac_controller.c | 2 ++ sound/pci/hda/hda_intel.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-)
sound/hda/hdac_controller.c +2 -0
@@ -447,6 +447,8 @@ static void azx_int_disable(struct hdac_bus *bus)list_for_each_entry (azx_dev, &bus->stream_list, list)snd_hdac_stream_updateb (azx_dev,SD_CTL ,SD_INT_MASK ,0 ); +synchronize_irq (bus->irq); +/* disable SIE for all streams */ snd_hdac_chip_writeb (bus,INTCTL ,0 );
sound/pci/hda/hda_intel.c +1 -1
@@ -1349,9 +1349,9 @@ static int azx_free(struct azx *chip) }if (bus->chip_init) { +azx_stop_chip (chip);azx_clear_irq_pending (chip);azx_stop_all_streams (chip); -azx_stop_chip (chip); }if (bus->irq >=0 )
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 39/344 ASoC: SOF: Intel: hda: Make hdac_device device-managed
In reply to Greg Kroah-HartmanFrom: Ranjani Sridharan <[email protected]>
[ Upstream commit ef9bec27485fefb6b93168fea73fda0dc9638046 ]
snd_hdac_ext_bus_device_exit() has been recently modified to no longer free the hdac device. SOF allocates memory for hdac_device and hda_hda_priv with kzalloc. Make them device-managed instead so that they will be freed when the SOF driver is unloaded.
Because of the above change, hda_codec is device-managed and it will be freed when the ASoC device is removed. Freeing the codec in snd_hda_codec_dev_release() leads to kernel panic while unloading and reloading the ASoC driver. So, avoid freeing the hda_codec for ASoC driver. This is done in the same patch to avoid bisect failure.
--- sound/pci/hda/hda_codec.c | 8 +++++++- sound/soc/sof/intel/hda-codec.c | 6 ++---- 2 files changed, 9 insertions(+), 5 deletions(-)
sound/pci/hda/hda_codec.c +7 -1
@@ -846,7 +846,13 @@ static void snd_hda_codec_dev_release(struct device *dev)snd_hda_sysfs_clear (codec);kfree (codec->modelname);kfree (codec->wcaps); -kfree (codec); + +/* +* In the case of ASoC HD-audio, hda_codec is device managed. +* It will be freed when the ASoC device is removed. +*/ +if (codec->core.type ==HDA_DEV_LEGACY ) +kfree (codec); }#define DEV_NAME_LEN 31
sound/soc/sof/intel/hda-codec.c +2 -4
@@ -62,8 +62,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address) address, resp);#if IS_ENABLED (CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC ) -/* snd_hdac_ext_bus_device_exit will use kfree to free hdev */ - hda_priv =kzalloc (sizeof (*hda_priv),GFP_KERNEL ); + hda_priv =devm_kzalloc (sdev->dev,sizeof (*hda_priv),GFP_KERNEL );if (!hda_priv)return -ENOMEM ;
@@ -82,8 +81,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address)return 0 ;#else -/* snd_hdac_ext_bus_device_exit will use kfree to free hdev */ - hdev =kzalloc (sizeof (*hdev),GFP_KERNEL ); + hdev =devm_kzalloc (sdev->dev,sizeof (*hdev),GFP_KERNEL );if (!hdev)return -ENOMEM ;
Signature · 1 line
2.20.1
Re: [PATCH 5.3 039/344] ASoC: SOF: Intel: hda: Make hdac_device device-managed
Quoted 8 lines · Greg Kroah-Hartman
Signed-off-by Libin Yang <[email protected]>Signed-off-by Ranjani Sridharan <[email protected]>Reviewed-by Takashi Iwai <[email protected]>Signed-off-by Mark Brown <[email protected]>Signed-off-by Sasha Levin <[email protected]>---
Looks like you're missing your own signoff on this (and quite a few of the others)?
Greg Kroah-Hartman
maintainerRe: [PATCH 5.3 039/344] ASoC: SOF: Intel: hda: Make hdac_device device-managed
Quoted 11 lines · Mark Brown
Quoted 8 lines · Greg Kroah-Hartman
Signed-off-by Libin Yang <[email protected]>Signed-off-by Ranjani Sridharan <[email protected]>Reviewed-by Takashi Iwai <[email protected]>Signed-off-by Mark Brown <[email protected]>Signed-off-by Sasha Levin <[email protected]>---
Quoted 2 lines
Looks like you're missing your own signoff on this (and quite a few of the others)?
Sasha signs off on these, I didn't, as he is the one that queues them up.
thanks,
greg k-h
Re: [PATCH 5.3 039/344] ASoC: SOF: Intel: hda: Make hdac_device device-managed
Quoted 11 lines · Greg Kroah-Hartman
Quoted 9 lines · Mark Brown
Quoted 7 lines · Greg Kroah-Hartman
Signed-off-by Libin Yang <[email protected]>Signed-off-by Ranjani Sridharan <[email protected]>Reviewed-by Takashi Iwai <[email protected]>Signed-off-by Mark Brown <[email protected]>Signed-off-by Sasha Levin <[email protected]>---
Quoted 5 lines
Quoted 2 lines
Looks like you're missing your own signoff on this (and quite a few of the others)?
Sasha signs off on these, I didn't, as he is the one that queues them up.
It seems off when they go out as e-mail with you as the sender - it'll be OK in git if he's the committer of course but it's weird here.
Greg Kroah-Hartman
maintainerPATCH 40/344 cpufreq: ap806: Add NULL check after kcalloc
In reply to Greg Kroah-HartmanFrom: Hariprasad Kelam <[email protected]>
[ Upstream commit 3355c91b79394593ebbb197c8e930a91826f4ff3 ]
Add NULL check after kcalloc.
Fix below issue reported by coccicheck ./drivers/cpufreq/armada-8k-cpufreq.c:138:1-12: alloc with no test, possible model on line 151
--- drivers/cpufreq/armada-8k-cpufreq.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/cpufreq/armada-8k-cpufreq.c +2 -0
@@ -136,6 +136,8 @@ static int __init armada_8k_cpufreq_init(void) nb_cpus =num_possible_cpus (); freq_tables =kcalloc (nb_cpus,sizeof (*freq_tables),GFP_KERNEL ); +if (!freq_tables) +return -ENOMEM ;cpumask_copy (&cpus, cpu_possible_mask);/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 41/344 ALSA: hda/hdmi - Dont report spurious jack state changes
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit 551626ec0ad28dc43cae3094c35be7088cc625ab ]
The HDMI jack handling reports the state change always via snd_jack_report() whenever hdmi_present_sense() is called, even if the state itself doesn't change from the previous time. This is mostly harmless but still a bit confusing to user-space.
This patch reduces such spurious jack state changes and reports only when the state really changed. Also, as a minor optimization, avoid overwriting the pin ELD data when the state is identical.
--- sound/pci/hda/patch_hdmi.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-)
sound/pci/hda/patch_hdmi.c +18 -14
@@ -1421,7 +1421,7 @@ static void hdmi_pcm_reset_pin(struct hdmi_spec *spec,/* update per_pin ELD from the given new ELD; * setup info frame and notification accordingly */ -static void update_eld (struct hda_codec *codec, +static bool update_eld (struct hda_codec *codec,struct hdmi_spec_per_pin *per_pin,struct hdmi_eld *eld) {
@@ -1452,18 +1452,22 @@ static void update_eld(struct hda_codec *codec,snd_hdmi_show_eld (codec, &eld->info); eld_changed = (pin_eld->eld_valid != eld->eld_valid); -if (eld->eld_valid && pin_eld->eld_valid) + eld_changed |= (pin_eld->monitor_present != eld->monitor_present); +if (!eld_changed && eld->eld_valid && pin_eld->eld_valid)if (pin_eld->eld_size != eld->eld_size ||memcmp (pin_eld->eld_buffer, eld->eld_buffer, eld->eld_size) !=0 ) eld_changed = true; - pin_eld->monitor_present = eld->monitor_present; - pin_eld->eld_valid = eld->eld_valid; - pin_eld->eld_size = eld->eld_size; -if (eld->eld_valid) -memcpy (pin_eld->eld_buffer, eld->eld_buffer, eld->eld_size); - pin_eld->info = eld->info; +if (eld_changed) { + pin_eld->monitor_present = eld->monitor_present; + pin_eld->eld_valid = eld->eld_valid; + pin_eld->eld_size = eld->eld_size; +if (eld->eld_valid) +memcpy (pin_eld->eld_buffer, eld->eld_buffer, + eld->eld_size); + pin_eld->info = eld->info; + }/* * Re-setup pin and infoframe. This is needed e.g. when
@@ -1481,6 +1485,7 @@ static void update_eld(struct hda_codec *codec,SNDRV_CTL_EVENT_MASK_VALUE |SNDRV_CTL_EVENT_MASK_INFO , &get_hdmi_pcm(spec, pcm_idx)->eld_ctl->id); +return eld_changed; }/* update ELD and jack state via HD-audio verbs */
@@ -1582,6 +1587,7 @@ static void sync_eld_via_acomp(struct hda_codec *codec,struct hdmi_spec *spec = codec->spec;struct hdmi_eld *eld = &spec->temp_eld;struct snd_jack *jack =NULL ; +bool changed;int size;mutex_lock (&per_pin->lock);
@@ -1608,15 +1614,13 @@ static void sync_eld_via_acomp(struct hda_codec *codec,* disconnected event. Jack must be fetched before update_eld() */ jack =pin_idx_to_jack (codec, per_pin); -update_eld (codec, per_pin, eld); + changed =update_eld (codec, per_pin, eld);if (jack ==NULL ) jack =pin_idx_to_jack (codec, per_pin); -if (jack ==NULL ) - goto unlock; -snd_jack_report (jack, - (eld->monitor_present && eld->eld_valid) ? +if (changed && jack) +snd_jack_report (jack, + (eld->monitor_present && eld->eld_valid) ?SND_JACK_AVOUT :0 ); - unlock:mutex_unlock (&per_pin->lock); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 42/344 regulator: lm363x: Fix off-by-one n_voltages for lm3632 ldo_vpos/ldo_vneg
In reply to Greg Kroah-HartmanFrom: Axel Lin <[email protected]>
[ Upstream commit 1e2cc8c5e0745b545d4974788dc606d678b6e564 ]
According to the datasheet https://www.ti.com/lit/ds/symlink/lm3632a.pdf
Table 20. VPOS Bias Register Field Descriptions VPOS[5:0] Sets the Positive Display Bias (LDO) Voltage (50 mV per step) 000000: 4 V
000001: 4.05 V
000010: 4.1 V
....................
011101: 5.45 V
011110: 5.5 V (Default)
011111: 5.55 V
....................
100111: 5.95 V
101000: 6 V
Note: Codes 101001 to 111111 map to 6 V
The LM3632_LDO_VSEL_MAX should be 0b101000 (0x28), so the maximum voltage can match the datasheet.
--- drivers/regulator/lm363x-regulator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/regulator/lm363x-regulator.c +1 -1
@@ -30,7 +30,7 @@/* LM3632 */ #define LM3632_BOOST_VSEL_MAX 0x26 -#define LM3632_LDO_VSEL_MAX 0x29 +#define LM3632_LDO_VSEL_MAX 0x28#define LM3632_VBOOST_MIN 4500000#define LM3632_VLDO_MIN 4000000
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 43/344 regulator: lm363x: Fix n_voltages setting for lm36274
In reply to Greg Kroah-HartmanFrom: Axel Lin <[email protected]>
[ Upstream commit 962f170d9344e5d9edb3903971c591f42d55e226 ]
According to the datasheet http://www.ti.com/lit/ds/symlink/lm36274.pdf:
Table 23. VPOS Bias Register Field Descriptions VPOS[5:0]:
VPOS voltage (50-mV steps): VPOS = 4 V + (Code × 50 mV), 6.5 V max 000000 = 4 V
000001 = 4.05 V
:
011110 = 5.5 V (Default)
:
110010 = 6.5 V
110011 to 111111 map to 6.5 V
So the LM36274_LDO_VSEL_MAX should be 0b110010 (0x32).
The valid selectors are 0 ... LM36274_LDO_VSEL_MAX, n_voltages should be LM36274_LDO_VSEL_MAX + 1. Similarly, the n_voltages should be LM36274_BOOST_VSEL_MAX + 1 for LM36274_BOOST.
--- drivers/regulator/lm363x-regulator.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/regulator/lm363x-regulator.c +4 -4
@@ -36,7 +36,7 @@/* LM36274 */ #define LM36274_BOOST_VSEL_MAX 0x3f -#define LM36274_LDO_VSEL_MAX 0x34 +#define LM36274_LDO_VSEL_MAX 0x32#define LM36274_VOLTAGE_MIN 4000000/* Common */
@@ -226,7 +226,7 @@ static const struct regulator_desc lm363x_regulator_desc[] = { .of_match = "vboost", .id = LM36274_BOOST, .ops = &lm363x_boost_voltage_table_ops, - .n_voltages = LM36274_BOOST_VSEL_MAX, + .n_voltages = LM36274_BOOST_VSEL_MAX + 1, .min_uV = LM36274_VOLTAGE_MIN, .uV_step = LM363X_STEP_50mV, .type = REGULATOR_VOLTAGE,
@@ -239,7 +239,7 @@ static const struct regulator_desc lm363x_regulator_desc[] = { .of_match = "vpos", .id = LM36274_LDO_POS, .ops = &lm363x_regulator_voltage_table_ops, - .n_voltages = LM36274_LDO_VSEL_MAX, + .n_voltages = LM36274_LDO_VSEL_MAX + 1, .min_uV = LM36274_VOLTAGE_MIN, .uV_step = LM363X_STEP_50mV, .type = REGULATOR_VOLTAGE,
@@ -254,7 +254,7 @@ static const struct regulator_desc lm363x_regulator_desc[] = { .of_match = "vneg", .id = LM36274_LDO_NEG, .ops = &lm363x_regulator_voltage_table_ops, - .n_voltages = LM36274_LDO_VSEL_MAX, + .n_voltages = LM36274_LDO_VSEL_MAX + 1, .min_uV = LM36274_VOLTAGE_MIN, .uV_step = LM363X_STEP_50mV, .type = REGULATOR_VOLTAGE,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 44/344 spi: dw-mmio: Clock should be shut when error occurs
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 3da9834d9381dd99273f2ad4e6d096c9187dc4f2 ]
When optional clock requesting fails, the main clock is still up and running, we should shut it down in such caee.
--- drivers/spi/spi-dw-mmio.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/spi/spi-dw-mmio.c +4 -2
@@ -172,8 +172,10 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)/* Optional clock needed to access the registers */ dwsmmio->pclk =devm_clk_get_optional (&pdev->dev,"pclk" ); -if (IS_ERR (dwsmmio->pclk)) -return PTR_ERR (dwsmmio->pclk); +if (IS_ERR (dwsmmio->pclk)) { + ret =PTR_ERR (dwsmmio->pclk); + goto out_clk; + } ret =clk_prepare_enable (dwsmmio->pclk);if (ret) goto out_clk;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 45/344 ASoC: tlv320aic31xx: suppress error message for EPROBE_DEFER
In reply to Greg Kroah-HartmanFrom: Lucas Stach <[email protected]>
[ Upstream commit b7e814deae33eb30f8f8c6528e8e69b107978d88 ]
Both the supplies and reset GPIO might need a probe deferral for the resource to be available. Don't print a error message in that case, as it is a normal operating condition.
--- sound/soc/codecs/tlv320aic31xx.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
sound/soc/codecs/tlv320aic31xx.c +5 -2
@@ -1553,7 +1553,8 @@ static int aic31xx_i2c_probe(struct i2c_client *i2c, aic31xx->gpio_reset =devm_gpiod_get_optional (aic31xx->dev,"reset" ,GPIOD_OUT_LOW );if (IS_ERR (aic31xx->gpio_reset)) { -dev_err (aic31xx->dev,"not able to acquire gpio\n" ); +if (PTR_ERR (aic31xx->gpio_reset) != -EPROBE_DEFER ) +dev_err (aic31xx->dev,"not able to acquire gpio\n" );return PTR_ERR (aic31xx->gpio_reset); }
@@ -1564,7 +1565,9 @@ static int aic31xx_i2c_probe(struct i2c_client *i2c,ARRAY_SIZE (aic31xx->supplies), aic31xx->supplies);if (ret) { -dev_err (aic31xx->dev,"Failed to request supplies: %d\n" , ret); +if (ret != -EPROBE_DEFER ) +dev_err (aic31xx->dev, +"Failed to request supplies: %d\n" , ret);return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 46/344 ASoC: sgtl5000: Fix of unmute outputs on probe
In reply to Greg Kroah-HartmanFrom: Oleksandr Suvorov <[email protected]>
[ Upstream commit 631bc8f0134ae9620d86a96b8c5f9445d91a2dca ]
To enable "zero cross detect" for ADC/HP, change HP_ZCD_EN/ADC_ZCD_EN bits only instead of writing the whole CHIP_ANA_CTRL register.
--- sound/soc/codecs/sgtl5000.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/soc/codecs/sgtl5000.c +3 -3
@@ -1288,6 +1288,7 @@ static int sgtl5000_probe(struct snd_soc_component *component)int ret;u16 reg;struct sgtl5000_priv *sgtl5000 =snd_soc_component_get_drvdata (component); +unsigned int zcd_mask =SGTL5000_HP_ZCD_EN |SGTL5000_ADC_ZCD_EN ;/* power up sgtl5000 */ ret =sgtl5000_set_power_regs (component);
@@ -1315,9 +1316,8 @@ static int sgtl5000_probe(struct snd_soc_component *component) 0x1f);snd_soc_component_write (component,SGTL5000_CHIP_PAD_STRENGTH , reg); -snd_soc_component_write (component,SGTL5000_CHIP_ANA_CTRL , -SGTL5000_HP_ZCD_EN | -SGTL5000_ADC_ZCD_EN ); +snd_soc_component_update_bits (component,SGTL5000_CHIP_ANA_CTRL , + zcd_mask, zcd_mask); snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL, SGTL5000_BIAS_R_MASK,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 47/344 ASoC: sgtl5000: Fix charge pump source assignment
In reply to Greg Kroah-HartmanFrom: Oleksandr Suvorov <[email protected]>
[ Upstream commit b6319b061ba279577fd7030a9848fbd6a17151e3 ]
If VDDA != VDDIO and any of them is greater than 3.1V, charge pump source can be assigned automatically [1].
[1] https://www.nxp.com/docs/en/data-sheet/SGTL5000.pdf
--- sound/soc/codecs/sgtl5000.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
sound/soc/codecs/sgtl5000.c +10 -5
@@ -1173,12 +1173,17 @@ static int sgtl5000_set_power_regs(struct snd_soc_component *component) SGTL5000_INT_OSC_EN);/* Enable VDDC charge pump */ ana_pwr |=SGTL5000_VDDC_CHRGPMP_POWERUP ; - }else if (vddio >=3100 && vdda >=3100 ) { + }else { ana_pwr &= ~SGTL5000_VDDC_CHRGPMP_POWERUP ; -/* VDDC use VDDIO rail */ - lreg_ctrl |=SGTL5000_VDDC_ASSN_OVRD ; - lreg_ctrl |=SGTL5000_VDDC_MAN_ASSN_VDDIO << -SGTL5000_VDDC_MAN_ASSN_SHIFT ; +/* +* if vddio == vdda the source of charge pump should be +* assigned manually to VDDIO +*/ +if (vddio == vdda) { + lreg_ctrl |=SGTL5000_VDDC_ASSN_OVRD ; + lreg_ctrl |=SGTL5000_VDDC_MAN_ASSN_VDDIO << +SGTL5000_VDDC_MAN_ASSN_SHIFT ; + } }snd_soc_component_write (component,SGTL5000_CHIP_LINREG_CTRL , lreg_ctrl);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 48/344 firmware: qcom_scm: Use proper types for dma mappings
In reply to Greg Kroah-HartmanFrom: Stephen Boyd <[email protected]>
[ Upstream commit 6e37ccf78a53296c6c7bf426065762c27829eb84 ]
We need to use the proper types and convert between physical addresses and dma addresses here to avoid mismatch warnings. This is especially important on systems with a different size for dma addresses and physical addresses. Otherwise, we get the following warning:
drivers/firmware/qcom_scm.c: In function "qcom_scm_assign_mem":
drivers/firmware/qcom_scm.c:469:47: error: passing argument 3 of "dma_alloc_coherent" from incompatible pointer type [-Werror=incompatible-pointer-types]
We also fix the size argument to dma_free_coherent() because that size doesn't need to be aligned after it's already aligned on the allocation size. In fact, dma debugging expects the same arguments to be passed to both the allocation and freeing sides of the functions so changing the size is incorrect regardless.
--- drivers/firmware/qcom_scm.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/firmware/qcom_scm.c +5 -2
@@ -9,6 +9,7 @@#include <linux/init.h> #include <linux/cpumask.h> #include <linux/export.h> +#include <linux/dma-direct.h> #include <linux/dma-mapping.h> #include <linux/module.h> #include <linux/types.h>
@@ -440,6 +441,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,phys_addr_t mem_to_map_phys;phys_addr_t dest_phys;phys_addr_t ptr_phys; +dma_addr_t ptr_dma;size_t mem_to_map_sz;size_t dest_sz;size_t src_sz;
@@ -457,9 +459,10 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, ptr_sz =ALIGN (src_sz,SZ_64 ) +ALIGN (mem_to_map_sz,SZ_64 ) +ALIGN (dest_sz,SZ_64 ); - ptr =dma_alloc_coherent (__scm->dev, ptr_sz, &ptr_phys,GFP_KERNEL ); + ptr =dma_alloc_coherent (__scm->dev, ptr_sz, &ptr_dma,GFP_KERNEL );if (!ptr)return -ENOMEM ; + ptr_phys =dma_to_phys (__scm->dev, ptr_dma);/* Fill source vmid detail */ src = ptr;
@@ -489,7 +492,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, ret =__qcom_scm_assign_mem (__scm->dev, mem_to_map_phys, mem_to_map_sz, ptr_phys, src_sz, dest_phys, dest_sz); -dma_free_coherent (__scm->dev,ALIGN (ptr_sz,SZ_64 ), ptr, ptr_phys); +dma_free_coherent (__scm->dev, ptr_sz, ptr, ptr_dma);if (ret) {dev_err (__scm->dev,"Assign memory protection call failed %d.\n" , ret);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 49/344 dmaengine: bcm2835: Print error in case setting DMA mask fails
In reply to Greg Kroah-HartmanFrom: Stefan Wahren <[email protected]>
[ Upstream commit 72503b25ee363827aafffc3e8d872e6a92a7e422 ]
During enabling of the RPi 4, we found out that the driver doesn't provide a helpful error message in case setting DMA mask fails. So add one.
--- drivers/dma/bcm2835-dma.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/dma/bcm2835-dma.c +3 -1
@@ -871,8 +871,10 @@ static int bcm2835_dma_probe(struct platform_device *pdev) pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask; rc =dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (32 )); -if (rc) +if (rc) { +dev_err (&pdev->dev,"Unable to set DMA mask\n" );return rc; + } od =devm_kzalloc (&pdev->dev,sizeof (*od),GFP_KERNEL );if (!od)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 50/344 leds: leds-lp5562 allow firmware files up to the maximum length
In reply to Greg Kroah-HartmanFrom: Nick Stoughton <[email protected]>
[ Upstream commit ed2abfebb041473092b41527903f93390d38afa7 ]
Firmware files are in ASCII, using 2 hex characters per byte. The maximum length of a firmware string is therefore
16 (commands) * 2 (bytes per command) * 2 (characters per byte) = 64
--- drivers/leds/leds-lp5562.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/leds/leds-lp5562.c +5 -1
@@ -260,7 +260,11 @@ static void lp5562_firmware_loaded(struct lp55xx_chip *chip) {const struct firmware *fw = chip->fw; -if (fw->size >LP5562_PROGRAM_LENGTH ) { +/* +* the firmware is encoded in ascii hex character, with 2 chars +* per byte +*/ +if (fw->size > (LP5562_PROGRAM_LENGTH *2 )) {dev_err (&chip->cl->dev,"firmware data size overflow: %zu\n" , fw->size);return ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 51/344 ASoC: SOF: reset DMA state in prepare
In reply to Greg Kroah-HartmanFrom: Kai Vehmanen <[email protected]>
[ Upstream commit 04c8027764bc82a325d3abc6f39a6a4642a937cb ]
When application goes through SUSPEND/STOP->PREPARE->START cycle, we should always reprogram the SOF device to start DMA from a known state so that hw_ptr/appl_ptrs remain valid. This is expected by ALSA core as it resets the buffer state as part of prepare (see snd_pcm_do_prepare()).
Fix the issue by forcing reconfiguration of the FW with STREAM_PCM_PARAMS in prepare(). Use combined logic to handle prepare and the existing flow to reprogram hw-params after system suspend.
Without the fix, first call to pcm pointer() will return an invalid hw_ptr and application may immediately observe XRUN status, unless "start_threshold" SW parameter is set to maximum value by the application.
--- sound/soc/sof/pcm.c | 27 +++++++++++++++------------ sound/soc/sof/pm.c | 2 +- sound/soc/sof/sof-priv.h | 2 +- 3 files changed, 17 insertions(+), 14 deletions(-)
sound/soc/sof/pcm.c +15 -12
@@ -208,12 +208,11 @@ static int sof_pcm_hw_params(struct snd_pcm_substream *substream,if (ret <0 )return ret; + spcm->prepared[substream->stream] = true; +/* save pcm hw_params */ memcpy (&spcm->params[substream->stream], params,sizeof (*params)); -/* clear hw_params_upon_resume flag */ - spcm->hw_params_upon_resume[substream->stream] =0 ; -return ret; }
@@ -236,6 +235,9 @@ static int sof_pcm_hw_free(struct snd_pcm_substream *substream)if (!spcm)return -EINVAL ; +if (!spcm->prepared[substream->stream]) +return 0 ; +dev_dbg (sdev->dev,"pcm: free stream %d dir %d\n" , spcm->pcm.pcm_id, substream->stream);
@@ -258,6 +260,8 @@ static int sof_pcm_hw_free(struct snd_pcm_substream *substream)if (ret <0 )dev_err (sdev->dev,"error: platform hw free failed\n" ); + spcm->prepared[substream->stream] = false; +return ret; }
@@ -278,11 +282,7 @@ static int sof_pcm_prepare(struct snd_pcm_substream *substream)if (!spcm)return -EINVAL ; -/* -* check if hw_params needs to be set-up again. -* This is only needed when resuming from system sleep. -*/ -if (!spcm->hw_params_upon_resume[substream->stream]) +if (spcm->prepared[substream->stream])return 0 ; dev_dbg(sdev->dev, "pcm: prepare stream %d dir %d\n", spcm->pcm.pcm_id,
@@ -311,6 +311,7 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd)struct snd_sof_pcm *spcm;struct sof_ipc_stream stream;struct sof_ipc_reply reply; +bool reset_hw_params = false;int ret;/* nothing to do for BE */
@@ -351,6 +352,7 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd)case SNDRV_PCM_TRIGGER_SUSPEND :case SNDRV_PCM_TRIGGER_STOP : stream.hdr.cmd |=SOF_IPC_STREAM_TRIG_STOP ; + reset_hw_params = true;break ;default :dev_err (sdev->dev,"error: unhandled trigger cmd %d\n" , cmd);
@@ -363,17 +365,17 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd) ret =sof_ipc_tx_message (sdev->ipc, stream.hdr.cmd, &stream,sizeof (stream), &reply,sizeof (reply)); -if (ret <0 || cmd !=SNDRV_PCM_TRIGGER_SUSPEND ) +if (ret <0 || !reset_hw_params)return ret;/* -* The hw_free op is usually called when the pcm stream is closed. -* Since the stream is not closed during suspend, the DSP needs to be -* notified explicitly to free pcm to prevent errors upon resume. +* In case of stream is stopped, DSP must be reprogrammed upon +* restart, so free PCM here. */ stream.hdr.size =sizeof (stream); stream.hdr.cmd =SOF_IPC_GLB_STREAM_MSG |SOF_IPC_STREAM_PCM_FREE ; stream.comp_id = spcm->stream[substream->stream].comp_id; + spcm->prepared[substream->stream] = false;/* send IPC to the DSP */ return sof_ipc_tx_message(sdev->ipc, stream.hdr.cmd, &stream,
@@ -481,6 +483,7 @@ static int sof_pcm_open(struct snd_pcm_substream *substream) spcm->stream[substream->stream].posn.host_posn =0 ; spcm->stream[substream->stream].posn.dai_posn =0 ; spcm->stream[substream->stream].substream = substream; + spcm->prepared[substream->stream] = false; ret =snd_sof_pcm_platform_open (sdev, substream);if (ret <0 )
sound/soc/sof/pm.c +1 -1
@@ -233,7 +233,7 @@ static int sof_set_hw_params_upon_resume(struct snd_sof_dev *sdev) state = substream->runtime->status->state;if (state ==SNDRV_PCM_STATE_SUSPENDED ) - spcm->hw_params_upon_resume[dir] =1 ; + spcm->prepared[dir] = false; } }
sound/soc/sof/sof-priv.h +1 -1
@@ -297,7 +297,7 @@ struct snd_sof_pcm {struct snd_sof_pcm_stream stream[2 ];struct list_head list;/* list in sdev pcm list */ struct snd_pcm_hw_params params[2 ]; -int hw_params_upon_resume[2 ];/* set up hw_params upon resume */ +bool prepared[2 ];/* PCM_PARAMS set successfully */ };/* ALSA SOF Kcontrol device */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 52/344 media: dib0700: fix link error for dibx000_i2c_set_speed
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 765bb8610d305ee488b35d07e2a04ae52fb2df9c ]
When CONFIG_DVB_DIB9000 is disabled, we can still compile code that now fails to link against dibx000_i2c_set_speed:
drivers/media/usb/dvb-usb/dib0700_devices.o: In function `dib01x0_pmu_update.constprop.7':
dib0700_devices.c:(.text.unlikely+0x1c9c): undefined reference to `dibx000_i2c_set_speed'
The call sites are both through dib01x0_pmu_update(), which gets passed an 'i2c' pointer from dib9000_get_i2c_master(), which has returned NULL. Checking this pointer seems to be a good idea anyway, and it avoids the link failure in most cases.
Sean Young found another case that is not fixed by that, where certain gcc versions leave an unused function in place that causes the link error, but adding an explict IS_ENABLED() check also solves this.
--- drivers/media/usb/dvb-usb/dib0700_devices.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/media/usb/dvb-usb/dib0700_devices.c +8 -0
@@ -2439,9 +2439,13 @@ static int dib9090_tuner_attach(struct dvb_usb_adapter *adap) 8, 0x0486, }; +if (!IS_ENABLED (CONFIG_DVB_DIB9000 )) +return -ENODEV ;if (dvb_attach (dib0090_fw_register, adap->fe_adap[0 ].fe, i2c, &dib9090_dib0090_config) ==NULL )return -ENODEV ; i2c =dib9000_get_i2c_master (adap->fe_adap[0 ].fe,DIBX000_I2C_INTERFACE_GPIO_1_2 ,0 ); +if (!i2c) +return -ENODEV ;if (dib01x0_pmu_update (i2c, data_dib190,10 ) !=0 )return -ENODEV ;dib0700_set_i2c_speed (adap->dev,1500 );
@@ -2517,10 +2521,14 @@ static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap)0 ,0x00ef , 8, 0x0406, }; +if (!IS_ENABLED (CONFIG_DVB_DIB9000 )) +return -ENODEV ; i2c =dib9000_get_tuner_interface (adap->fe_adap[0 ].fe);if (dvb_attach (dib0090_fw_register, adap->fe_adap[0 ].fe, i2c, &nim9090md_dib0090_config[0 ]) ==NULL )return -ENODEV ; i2c =dib9000_get_i2c_master (adap->fe_adap[0 ].fe,DIBX000_I2C_INTERFACE_GPIO_1_2 ,0 ); +if (!i2c) +return -ENODEV ;if (dib01x0_pmu_update (i2c, data_dib190,10 ) <0 )return -ENODEV ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 53/344 media: mtk-cir: lower de-glitch counter for rc-mm protocol
In reply to Greg Kroah-HartmanFrom: Sean Young <[email protected]>
[ Upstream commit 5dd4b89dc098bf22cd13e82a308f42a02c102b2b ]
The rc-mm protocol can't be decoded by the mtk-cir since the de-glitch filter removes pulses/spaces shorter than 294 microseconds.
Tested on a BananaPi R2.
--- drivers/media/rc/mtk-cir.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/media/rc/mtk-cir.c +8 -0
@@ -35,6 +35,11 @@/* Fields containing pulse width data */ #define MTK_WIDTH_MASK (GENMASK(7, 0)) +/* IR threshold */ +#define MTK_IRTHD 0x14 +#define MTK_DG_CNT_MASK (GENMASK(12, 8)) +#define MTK_DG_CNT (x) ((x) << 8) +/* Bit to enable interrupt */ #define MTK_IRINT_EN BIT(0)
@@ -398,6 +403,9 @@ static int mtk_ir_probe(struct platform_device *pdev)mtk_w32_mask (ir, val, ir->data->fields[MTK_HW_PERIOD ].mask, ir->data->fields[MTK_HW_PERIOD ].reg); +/* Set de-glitch counter */ +mtk_w32_mask (ir,MTK_DG_CNT (1 ),MTK_DG_CNT_MASK ,MTK_IRTHD ); +/* Enable IR and PWM */ val =mtk_r32 (ir,MTK_CONFIG_HIGH_REG ); val |=MTK_OK_COUNT (ir->data->ok_count) |MTK_PWM_EN |MTK_IR_EN ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 54/344 ASoC: SOF: pci: mark last_busy value at runtime PM init
In reply to Greg Kroah-HartmanFrom: Pan Xiuli <[email protected]>
[ Upstream commit f1b1b9b136827915624136624ff54aba5890a15b ]
If last_busy value is not set at runtime PM enable, the device will be suspend immediately after usage counter is 0. Set the last_busy value to make sure delay is working at first boot up.
--- sound/soc/sof/sof-pci-dev.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/sof/sof-pci-dev.c +3 -0
@@ -223,6 +223,9 @@ static void sof_pci_probe_complete(struct device *dev)*/ pm_runtime_allow (dev); +/* mark last_busy for pm_runtime to make sure not suspend immediately */ +pm_runtime_mark_last_busy (dev); +/* follow recommendation in pci-driver.c to decrement usage counter */ pm_runtime_put_noidle (dev); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 55/344 media: exynos4-is: fix leaked of_node references
In reply to Greg Kroah-HartmanFrom: Wen Yang <[email protected]>
[ Upstream commit da79bf41a4d170ca93cc8f3881a70d734a071c37 ]
The call to of_get_child_by_name returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage.
Detected by coccinelle with the following warnings:
drivers/media/platform/exynos4-is/fimc-is.c:813:2-8: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 807, but without a corresponding object release within this function. drivers/media/platform/exynos4-is/fimc-is.c:870:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 807, but without a corresponding object release within this function. drivers/media/platform/exynos4-is/fimc-is.c:885:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 807, but without a corresponding object release within this function. drivers/media/platform/exynos4-is/media-dev.c:545:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 541, but without a corresponding object release within this function. drivers/media/platform/exynos4-is/media-dev.c:528:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 499, but without a corresponding object release within this function. drivers/media/platform/exynos4-is/media-dev.c:534:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 499, but without a corresponding object release within this function.
--- drivers/media/platform/exynos4-is/fimc-is.c | 1 + drivers/media/platform/exynos4-is/media-dev.c | 2 ++ 2 files changed, 3 insertions(+)
drivers/media/platform/exynos4-is/fimc-is.c +1 -0
@@ -806,6 +806,7 @@ static int fimc_is_probe(struct platform_device *pdev)return -ENODEV ; is->pmu_regs =of_iomap (node,0 ); +of_node_put (node);if (!is->pmu_regs)return -ENOMEM ;
drivers/media/platform/exynos4-is/media-dev.c +2 -0
@@ -501,6 +501,7 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd)continue ; ret =fimc_md_parse_port_node (fmd, port, index); +of_node_put (port);if (ret <0 ) {of_node_put (node); goto cleanup;
@@ -542,6 +543,7 @@ static int __of_get_csis_id(struct device_node *np)if (!np)return -EINVAL ;of_property_read_u32 (np,"reg" , ®); +of_node_put (np);return reg -FIMC_INPUT_MIPI_CSI2_0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 57/344 media: vb2: reorder checks in vb2_poll()
In reply to Greg Kroah-HartmanFrom: Michael Tretter <[email protected]>
[ Upstream commit 8d86a15649957c182e90fa2b1267c16699bc12f1 ]
When reaching the end of stream, V4L2 clients may expect the V4L2_EOS_EVENT before being able to dequeue the last buffer, which has the V4L2_BUF_FLAG_LAST flag set.
If the vb2_poll() function first checks for events and afterwards if buffers are available, a driver can queue the V4L2_EOS_EVENT event and return the buffer after the check for events but before the check for buffers. This causes vb2_poll() to signal that the buffer with V4L2_BUF_FLAG_LAST can be read without the V4L2_EOS_EVENT being available.
First, check for available buffers and afterwards for events to ensure that if vb2_poll() signals POLLIN | POLLRDNORM for the V4L2_BUF_FLAG_LAST buffer, it also signals POLLPRI for the V4L2_EOS_EVENT.
--- drivers/media/common/videobuf2/videobuf2-v4l2.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/media/common/videobuf2/videobuf2-v4l2.c +5 -3
@@ -872,17 +872,19 @@ EXPORT_SYMBOL_GPL(vb2_queue_release);__poll_t vb2_poll (struct vb2_queue *q,struct file *file,poll_table *wait) {struct video_device *vfd =video_devdata (file); -__poll_t res =0 ; +__poll_t res; + + res =vb2_core_poll (q, file, wait);if (test_bit (V4L2_FL_USES_V4L2_FH , &vfd->flags)) {struct v4l2_fh *fh = file->private_data;poll_wait (file, &fh->wait, wait);if (v4l2_event_pending (fh)) - res =EPOLLPRI ; + res |=EPOLLPRI ; } -return res |vb2_core_poll (q, file, wait); +return res; }EXPORT_SYMBOL_GPL (vb2_poll);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 58/344 media: vivid: work around high stack usage with clang
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 1a03f91c2c2419c3709c4554952c66695575e91c ]
Building a KASAN-enabled kernel with clang ends up in a case where too much is inlined into vivid_thread_vid_cap() and the stack usage grows a lot, possibly when the register allocation fails to produce efficient code and spills a lot of temporaries to the stack. This uses more than twice the amount of stack than the sum of the individual functions when they are not inlined:
drivers/media/platform/vivid/vivid-kthread-cap.c:766:12: error: stack frame size of 2208 bytes in function 'vivid_thread_vid_cap' [-Werror,-Wframe-larger-than=]
Marking two of the key functions in here as 'noinline_for_stack' avoids the pathological case in clang without any apparent downside for gcc.
--- drivers/media/platform/vivid/vivid-kthread-cap.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/media/platform/vivid/vivid-kthread-cap.c +4 -3
@@ -232,8 +232,8 @@ static void *plane_vaddr(struct tpg_data *tpg, struct vivid_buffer *buf,return vbuf; } -static int vivid_copy_buffer (struct vivid_dev *dev,unsigned p,u8 *vcapbuf, -struct vivid_buffer *vid_cap_buf) +static noinline_for_stack int vivid_copy_buffer(struct vivid_dev *dev, unsigned p, +u8 *vcapbuf,struct vivid_buffer *vid_cap_buf) {bool blank = dev->must_blank[vid_cap_buf->vb.vb2_buf.index];struct tpg_data *tpg = &dev->tpg;
@@ -672,7 +672,8 @@ static void vivid_cap_update_frame_period(struct vivid_dev *dev) dev->cap_frame_period = f_period; } -static void vivid_thread_vid_cap_tick (struct vivid_dev *dev,int dropped_bufs) +static noinline_for_stack void vivid_thread_vid_cap_tick(struct vivid_dev *dev, +int dropped_bufs) {struct vivid_buffer *vid_cap_buf =NULL ;struct vivid_buffer *vbi_cap_buf =NULL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 59/344 media: hdpvr: Add device num check and handling
In reply to Greg Kroah-HartmanFrom: Luke Nowakowski-Krijger <[email protected]>
[ Upstream commit d4a6a9537bc32811486282206ecfb7c53754b74d ]
Add hdpvr device num check and error handling
We need to increment the device count atomically before we checkout a device to make sure that we do not reach the max count, otherwise we get out-of-bounds errors as reported by syzbot.
--- drivers/media/usb/hdpvr/hdpvr-core.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/media/usb/hdpvr/hdpvr-core.c +11 -1
@@ -271,6 +271,7 @@ static int hdpvr_probe(struct usb_interface *interface,#endif size_t buffer_size;int i; +int dev_num;int retval = -ENOMEM ;/* allocate memory for our device state and initialize it */
@@ -368,8 +369,17 @@ static int hdpvr_probe(struct usb_interface *interface, }#endif + dev_num =atomic_inc_return (&dev_nr); +if (dev_num >=HDPVR_MAX ) { +v4l2_err (&dev->v4l2_dev, +"max device number reached, device register failed\n" ); +atomic_dec (&dev_nr); + retval = -ENODEV ; + goto reg_fail; + } + retval =hdpvr_register_videodev (dev, &interface->dev, - video_nr[atomic_inc_return (&dev_nr)]); + video_nr[dev_num]);if (retval <0 ) {v4l2_err (&dev->v4l2_dev,"registering videodev failed\n" ); goto reg_fail;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 60/344 media: i2c: ov5640: Check for devm_gpiod_get_optional() error
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 8791a102ce579346cea9d2f911afef1c1985213c ]
The power down and reset GPIO are optional, but the return value from devm_gpiod_get_optional() needs to be checked and propagated in the case of error, so that probe deferral can work.
--- drivers/media/i2c/ov5640.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/media/i2c/ov5640.c +5 -0
@@ -3022,9 +3022,14 @@ static int ov5640_probe(struct i2c_client *client,/* request optional power down pin */ sensor->pwdn_gpio =devm_gpiod_get_optional (dev,"powerdown" ,GPIOD_OUT_HIGH ); +if (IS_ERR (sensor->pwdn_gpio)) +return PTR_ERR (sensor->pwdn_gpio); +/* request optional reset pin */ sensor->reset_gpio =devm_gpiod_get_optional (dev,"reset" ,GPIOD_OUT_HIGH ); +if (IS_ERR (sensor->reset_gpio)) +return PTR_ERR (sensor->reset_gpio);v4l2_i2c_subdev_init (&sensor->sd, client, &ov5640_subdev_ops);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 61/344 time/tick-broadcast: Fix tick_broadcast_offline() lockdep complaint
In reply to Greg Kroah-HartmanFrom: Paul E. McKenney <[email protected]>
[ Upstream commit 84ec3a0787086fcd25f284f59b3aa01fd6fc0a5d ]
time/tick-broadcast: Fix tick_broadcast_offline() lockdep complaint
The TASKS03 and TREE04 rcutorture scenarios produce the following lockdep complaint:
WARNING: inconsistent lock state
5.2.0-rc1+ #513 Not tainted
--------------------------------
inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage.
migration/1/14 [HC0[0]:SC0[0]:HE1:SE1] takes:
(____ptrval____) (tick_broadcast_lock){?...}, at: tick_broadcast_offline+0xf/0x70
{IN-HARDIRQ-W} state was registered at:
lock_acquire+0xb0/0x1c0
_raw_spin_lock_irqsave+0x3c/0x50
tick_broadcast_switch_to_oneshot+0xd/0x40
tick_switch_to_oneshot+0x4f/0xd0
hrtimer_run_queues+0xf3/0x130
run_local_timers+0x1c/0x50
update_process_times+0x1c/0x50
tick_periodic+0x26/0xc0
tick_handle_periodic+0x1a/0x60
smp_apic_timer_interrupt+0x80/0x2a0
apic_timer_interrupt+0xf/0x20
_raw_spin_unlock_irqrestore+0x4e/0x60
rcu_nocb_gp_kthread+0x15d/0x590
kthread+0xf3/0x130
ret_from_fork+0x3a/0x50
irq event stamp: 171
hardirqs last enabled at (171): [<ffffffff8a201a37>] trace_hardirqs_on_thunk+0x1a/0x1c
hardirqs last disabled at (170): [<ffffffff8a201a53>] trace_hardirqs_off_thunk+0x1a/0x1c
softirqs last enabled at (0): [<ffffffff8a264ee0>] copy_process.part.56+0x650/0x1cb0
softirqs last disabled at (0): [<0000000000000000>] 0x0
[...]To reproduce, run the following rcutorture test:
$ tools/testing/selftests/rcutorture/bin/kvm.sh --duration 5 --kconfig "CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y" --configs "TASKS03 TREE04"
It turns out that tick_broadcast_offline() was an innocent bystander. After all, interrupts are supposed to be disabled throughout take_cpu_down(), and therefore should have been disabled upon entry to tick_offline_cpu() and thus to tick_broadcast_offline(). This suggests that one of the CPU-hotplug notifiers was incorrectly enabling interrupts, and leaving them enabled on return.
Some debugging code showed that the culprit was sched_cpu_dying(). It had irqs enabled after return from sched_tick_stop(). Which in turn had irqs enabled after return from cancel_delayed_work_sync(). Which is a wrapper around __cancel_work_timer(). Which can sleep in the case where something else is concurrently trying to cancel the same delayed work, and as Thomas Gleixner pointed out on IRC, sleeping is a decidedly bad idea when you are invoked from take_cpu_down(), regardless of the state you leave interrupts in upon return.
Code inspection located no reason why the delayed work absolutely needed to be canceled from sched_tick_stop(): The work is not bound to the outgoing CPU by design, given that the whole point is to collect statistics without disturbing the outgoing CPU.
This commit therefore simply drops the cancel_delayed_work_sync() from sched_tick_stop(). Instead, a new ->state field is added to the tick_work structure so that the delayed-work handler function sched_tick_remote() can avoid reposting itself. A cpu_is_offline() check is also added to sched_tick_remote() to avoid mucking with the state of an offlined CPU (though it does appear safe to do so). The sched_tick_start() and sched_tick_stop() functions also update ->state, and sched_tick_start() also schedules the delayed work if ->state indicates that it is not already in flight.
--- kernel/sched/core.c | 57 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 8 deletions(-)
kernel/sched/core.c +49 -8
@@ -3486,8 +3486,36 @@ void scheduler_tick(void)struct tick_work {int cpu; +atomic_t state;struct delayed_work work; }; +/* Values for ->state, see diagram below. */ +#define TICK_SCHED_REMOTE_OFFLINE 0 +#define TICK_SCHED_REMOTE_OFFLINING 1 +#define TICK_SCHED_REMOTE_RUNNING 2 + +/* +* State diagram for ->state: +* +* +* TICK_SCHED_REMOTE_OFFLINE +* | ^ +* | | +* | | sched_tick_remote() +* | | +* | | +* +--TICK_SCHED_REMOTE_OFFLINING +* | ^ +* | | +* sched_tick_start() | | sched_tick_stop() +* | | +* V | +* TICK_SCHED_REMOTE_RUNNING +* +* +* Other transitions get WARN_ON_ONCE(), except that sched_tick_remote() +* and sched_tick_start() are happy to leave the state in RUNNING. +*/ static struct tick_work __percpu *tick_work_cpu;
@@ -3500,6 +3528,7 @@ static void sched_tick_remote(struct work_struct *work)struct task_struct *curr;struct rq_flags rf;u64 delta; +int os;/* * Handle the tick only if it appears the remote CPU is running in full
@@ -3513,7 +3542,7 @@ static void sched_tick_remote(struct work_struct *work)rq_lock_irq (rq, &rf); curr = rq->curr; -if (is_idle_task (curr)) +if (is_idle_task (curr) ||cpu_is_offline (cpu)) goto out_unlock;update_rq_clock (rq);
@@ -3533,13 +3562,18 @@ static void sched_tick_remote(struct work_struct *work)/* * Run the remote tick once per second (1Hz). This arbitrary * frequency is large enough to avoid overload but short enough -* to keep scheduler internal stats reasonably up to date. +* to keep scheduler internal stats reasonably up to date. But +* first update state to reflect hotplug activity if required. */ -queue_delayed_work (system_unbound_wq, dwork,HZ ); + os =atomic_fetch_add_unless (&twork->state,-1 ,TICK_SCHED_REMOTE_RUNNING ); +WARN_ON_ONCE (os ==TICK_SCHED_REMOTE_OFFLINE ); +if (os ==TICK_SCHED_REMOTE_RUNNING ) +queue_delayed_work (system_unbound_wq, dwork,HZ ); }static void sched_tick_start (int cpu) { +int os;struct tick_work *twork;if (housekeeping_cpu (cpu,HK_FLAG_TICK ))
@@ -3548,15 +3582,20 @@ static void sched_tick_start(int cpu)WARN_ON_ONCE (!tick_work_cpu); twork =per_cpu_ptr (tick_work_cpu, cpu); - twork->cpu = cpu; -INIT_DELAYED_WORK (&twork->work, sched_tick_remote); -queue_delayed_work (system_unbound_wq, &twork->work,HZ ); + os =atomic_xchg (&twork->state,TICK_SCHED_REMOTE_RUNNING ); +WARN_ON_ONCE (os ==TICK_SCHED_REMOTE_RUNNING ); +if (os ==TICK_SCHED_REMOTE_OFFLINE ) { + twork->cpu = cpu; +INIT_DELAYED_WORK (&twork->work, sched_tick_remote); +queue_delayed_work (system_unbound_wq, &twork->work,HZ ); + } }#ifdef CONFIG_HOTPLUG_CPU static void sched_tick_stop (int cpu) {struct tick_work *twork; +int os;if (housekeeping_cpu (cpu,HK_FLAG_TICK ))return ;
@@ -3564,7 +3603,10 @@ static void sched_tick_stop(int cpu)WARN_ON_ONCE (!tick_work_cpu); twork =per_cpu_ptr (tick_work_cpu, cpu); - cancel_delayed_work_sync(&twork->work); +/* There cannot be competing actions, but don't rely on stop-machine. */ + os =atomic_xchg (&twork->state,TICK_SCHED_REMOTE_OFFLINING ); +WARN_ON_ONCE (os !=TICK_SCHED_REMOTE_RUNNING ); + /* Don't cancel, as this would mess up the state machine. */ }#endif /* CONFIG_HOTPLUG_CPU */
@@ -3572,7 +3614,6 @@ int __init sched_tick_offload_init(void) { tick_work_cpu = alloc_percpu(struct tick_work);BUG_ON (!tick_work_cpu); -return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 62/344 sched/fair: Fix imbalance due to CPU affinity
In reply to Greg Kroah-HartmanFrom: Vincent Guittot <[email protected]>
[ Upstream commit f6cad8df6b30a5d2bbbd2e698f74b4cafb9fb82b ]
The load_balance() has a dedicated mecanism to detect when an imbalance is due to CPU affinity and must be handled at parent level. In this case, the imbalance field of the parent's sched_group is set.
The description of sg_imbalanced() gives a typical example of two groups of 4 CPUs each and 4 tasks each with a cpumask covering 1 CPU of the first group and 3 CPUs of the second group. Something like:
{ 0 1 2 3 } { 4 5 6 7 }
* * * *But the load_balance fails to fix this UC on my octo cores system made of 2 clusters of quad cores.
Whereas the load_balance is able to detect that the imbalanced is due to CPU affinity, it fails to fix it because the imbalance field is cleared before letting parent level a chance to run. In fact, when the imbalance is detected, the load_balance reruns without the CPU with pinned tasks. But there is no other running tasks in the situation described above and everything looks balanced this time so the imbalance field is immediately cleared.
The imbalance field should not be cleared if there is no other task to move when the imbalance is detected.
--- kernel/sched/fair.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/sched/fair.c +3 -2
@@ -9052,9 +9052,10 @@ static int load_balance(int this_cpu, struct rq *this_rq, out_balanced:/* * We reach balance although we may have faced some affinity -* constraints. Clear the imbalance flag if it was set. +* constraints. Clear the imbalance flag only if other tasks got +* a chance to move and fix the imbalance. */ -if (sd_parent) { +if (sd_parent && !(env.flags &LBF_ALL_PINNED )) {int *group_imbalance = &sd_parent->groups->sgc->imbalance;if (*group_imbalance)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 63/344 sched/core: Fix CPU controller for !RT_GROUP_SCHED
In reply to Greg Kroah-HartmanFrom: Juri Lelli <[email protected]>
[ Upstream commit a07db5c0865799ebed1f88be0df50c581fb65029 ]
On !CONFIG_RT_GROUP_SCHED configurations it is currently not possible to move RT tasks between cgroups to which CPU controller has been attached; but it is oddly possible to first move tasks around and then make them RT (setschedule to FIFO/RR).
E.g.:
# mkdir /sys/fs/cgroup/cpu,cpuacct/group1 # chrt -fp 10 $$ # echo $$ > /sys/fs/cgroup/cpu,cpuacct/group1/tasks bash: echo: write error: Invalid argument # chrt -op 0 $$ # echo $$ > /sys/fs/cgroup/cpu,cpuacct/group1/tasks # chrt -fp 10 $$ # cat /sys/fs/cgroup/cpu,cpuacct/group1/tasks 2345 2598 # chrt -p 2345 pid 2345's current scheduling policy: SCHED_FIFO pid 2345's current scheduling priority: 10
Also, as Michal noted, it is currently not possible to enable CPU controller on unified hierarchy with !CONFIG_RT_GROUP_SCHED (if there are any kernel RT threads in root cgroup, they can't be migrated to the newly created CPU controller's root in cgroup_update_dfl_csses()).
Existing code comes with a comment saying the "we don't support RT-tasks being in separate groups". Such comment is however stale and belongs to pre-RT_GROUP_SCHED times. Also, it doesn't make much sense for !RT_GROUP_ SCHED configurations, since checks related to RT bandwidth are not performed at all in these cases.
Make moving RT tasks between CPU controller groups viable by removing special case check for RT (and DEADLINE) tasks.
--- kernel/sched/core.c | 4 ---- 1 file changed, 4 deletions(-)
kernel/sched/core.c +0 -4
@@ -6980,10 +6980,6 @@ static int cpu_cgroup_can_attach(struct cgroup_taskset *tset)#ifdef CONFIG_RT_GROUP_SCHED if (!sched_rt_can_attach (css_tg (css), task))return -EINVAL ; -#else -/* We don't support RT-tasks being in separate groups */ -if (task->sched_class != &fair_sched_class) -return -EINVAL ;#endif /* * Serialize against wake_up_new_task() such that if its
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 64/344 x86/apic: Make apic_pending_intr_clear() more robust
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit cc8bf191378c1da8ad2b99cf470ee70193ace84e ]
In course of developing shorthand based IPI support issues with the function which tries to clear eventually pending ISR bits in the local APIC were observed.
1) O-day testing triggered the WARN_ON() in apic_pending_intr_clear().
This warning is emitted when the function fails to clear pending ISR bits or observes pending IRR bits which are not delivered to the CPU after the stale ISR bit(s) are ACK'ed.
Unfortunately the function only emits a WARN_ON() and fails to dump the IRR/ISR content. That's useless for debugging.
Feng added spot on debug printk's which revealed that the stale IRR bit belonged to the APIC timer interrupt vector, but adding ad hoc debug code does not help with sporadic failures in the field.
Rework the loop so the full IRR/ISR contents are saved and on failure dumped.
2) The loop termination logic is interesting at best.
If the machine has no TSC or cpu_khz is not known yet it tries 1 million times to ack stale IRR/ISR bits. What?
With TSC it uses the TSC to calculate the loop termination. It takes a timestamp at entry and terminates the loop when:
(rdtsc() - start_timestamp) >= (cpu_hkz << 10)
That's roughly one second.
Both methods are problematic. The APIC has 256 vectors, which means that in theory max. 256 IRR/ISR bits can be set. In practice this is impossible and the chance that more than a few bits are set is close to zero.
With the pure loop based approach the 1 million retries are complete overkill.
With TSC this can terminate too early in a guest which is running on a heavily loaded host even with only a couple of IRR/ISR bits set. The reason is that after acknowledging the highest priority ISR bit, pending IRRs must get serviced first before the next round of acknowledge can take place as the APIC (real and virtualized) does not honour EOI without a preceeding interrupt on the CPU. And every APIC read/write takes a VMEXIT if the APIC is virtualized. While trying to reproduce the issue 0-day reported it was observed that the guest was scheduled out long enough under heavy load that it terminated after 8 iterations.
Make the loop terminate after 512 iterations. That's plenty enough in any case and does not take endless time to complete.
--- arch/x86/kernel/apic/apic.c | 107 +++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 44 deletions(-)
arch/x86/kernel/apic/apic.c +63 -44
@@ -1495,54 +1495,72 @@ static void lapic_setup_esr(void) oldvalue, value); } -static void apic_pending_intr_clear (void ) +#define APIC_IR_REGS APIC_ISR_NR +#define APIC_IR_BITS (APIC_IR_REGS * 32) +#define APIC_IR_MAPSIZE (APIC_IR_BITS / BITS_PER_LONG) + +union apic_ir { +unsigned long map[APIC_IR_MAPSIZE ]; +u32 regs[APIC_IR_REGS ]; +}; + +static bool apic_check_and_ack (union apic_ir *irr,union apic_ir *isr) { -long long max_loops = cpu_khz ? cpu_khz :1000000 ; -unsigned long long tsc =0 , ntsc; -unsigned int queued; -unsigned long value; -int i, j, acked =0 ; +int i, bit; + +/* Read the IRRs */ +for (i =0 ; i <APIC_IR_REGS ; i++) + irr->regs[i] =apic_read (APIC_IRR + i *0x10 ); + +/* Read the ISRs */ +for (i =0 ; i <APIC_IR_REGS ; i++) + isr->regs[i] =apic_read (APIC_ISR + i *0x10 ); -if (boot_cpu_has (X86_FEATURE_TSC )) - tsc =rdtsc ();/* -* After a crash, we no longer service the interrupts and a pending -* interrupt from previous kernel might still have ISR bit set. -* -* Most probably by now CPU has serviced that pending interrupt and -* it might not have done the ack_APIC_irq() because it thought, -* interrupt came from i8259 as ExtInt. LAPIC did not get EOI so it -* does not clear the ISR bit and cpu thinks it has already serivced -* the interrupt. Hence a vector might get locked. It was noticed -* for timer irq (vector 0x31). Issue an extra EOI to clear ISR. +* If the ISR map is not empty. ACK the APIC and run another round +* to verify whether a pending IRR has been unblocked and turned +* into a ISR. */ -do { - queued =0 ; -for (i =APIC_ISR_NR -1 ; i >=0 ; i--) - queued |=apic_read (APIC_IRR + i*0x10 ); - -for (i =APIC_ISR_NR -1 ; i >=0 ; i--) { - value =apic_read (APIC_ISR + i*0x10 ); -for_each_set_bit (j, &value,32 ) { -ack_APIC_irq (); - acked++; - } - } -if (acked >256 ) { -pr_err ("LAPIC pending interrupts after %d EOI\n" , acked); -break ; - } -if (queued) { -if (boot_cpu_has (X86_FEATURE_TSC ) && cpu_khz) { - ntsc =rdtsc (); - max_loops = (long long )cpu_khz <<10 ; - max_loops -= ntsc - tsc; - }else { - max_loops--; - } - } - }while (queued && max_loops >0 ); -WARN_ON (max_loops <=0 ); +if (!bitmap_empty (isr->map,APIC_IR_BITS )) { +/* +* There can be multiple ISR bits set when a high priority +* interrupt preempted a lower priority one. Issue an ACK +* per set bit. +*/ +for_each_set_bit (bit, isr->map,APIC_IR_BITS ) +ack_APIC_irq (); +return true; + } + +return !bitmap_empty (irr->map,APIC_IR_BITS ); +} + +/* +* After a crash, we no longer service the interrupts and a pending +* interrupt from previous kernel might still have ISR bit set. +* +* Most probably by now the CPU has serviced that pending interrupt and it +* might not have done the ack_APIC_irq() because it thought, interrupt +* came from i8259 as ExtInt. LAPIC did not get EOI so it does not clear +* the ISR bit and cpu thinks it has already serivced the interrupt. Hence +* a vector might get locked. It was noticed for timer irq (vector +* 0x31). Issue an extra EOI to clear ISR. +* +* If there are pending IRR bits they turn into ISR bits after a higher +* priority ISR bit has been acked. +*/ +static void apic_pending_intr_clear (void ) +{ +union apic_ir irr, isr; +unsigned int i; + +/* 512 loops are way oversized and give the APIC a chance to obey. */ +for (i =0 ; i <512 ; i++) { +if (!apic_check_and_ack (&irr, &isr)) +return ; + } +/* Dump the IRR/ISR content if that failed */ +pr_warn ("APIC: Stale IRR: %256pb ISR: %256pb\n" , irr.map, isr.map); }/**
@@ -1610,6 +1628,7 @@ static void setup_local_APIC(void) value &= ~APIC_TPRI_MASK ;apic_write (APIC_TASKPRI , value); +/* Clear eventually stale ISR/IRR bits */ apic_pending_intr_clear ();/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 65/344 sched/deadline: Fix bandwidth accounting at all levels after offline migration
In reply to Greg Kroah-HartmanFrom: Juri Lelli <[email protected]>
[ Upstream commit 59d06cea1198d665ba11f7e8c5f45b00ff2e4812 ]
If a task happens to be throttled while the CPU it was running on gets hotplugged off, the bandwidth associated with the task is not correctly migrated with it when the replenishment timer fires (offline_migration).
Fix things up, for this_bw, running_bw and total_bw, when replenishment timer fires and task is migrated (dl_task_offline_migration()).
--- kernel/sched/deadline.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
kernel/sched/deadline.c +33 -0
@@ -529,6 +529,7 @@ static struct rq *find_lock_later_rq(struct task_struct *task, struct rq *rq);static struct rq *dl_task_offline_migration (struct rq *rq,struct task_struct *p) {struct rq *later_rq =NULL ; +struct dl_bw *dl_b; later_rq =find_lock_later_rq (p, rq);if (!later_rq) {
@@ -557,6 +558,38 @@ static struct rq *dl_task_offline_migration(struct rq *rq, struct task_struct *pdouble_lock_balance (rq, later_rq); } +if (p->dl.dl_non_contending || p->dl.dl_throttled) { +/* +* Inactive timer is armed (or callback is running, but +* waiting for us to release rq locks). In any case, when it +* will fire (or continue), it will see running_bw of this +* task migrated to later_rq (and correctly handle it). +*/ +sub_running_bw (&p->dl, &rq->dl); +sub_rq_bw (&p->dl, &rq->dl); + +add_rq_bw (&p->dl, &later_rq->dl); +add_running_bw (&p->dl, &later_rq->dl); + }else { +sub_rq_bw (&p->dl, &rq->dl); +add_rq_bw (&p->dl, &later_rq->dl); + } + +/* +* And we finally need to fixup root_domain(s) bandwidth accounting, +* since p is still hanging out in the old (now moved to default) root +* domain. +*/ + dl_b = &rq->rd->dl_bw; +raw_spin_lock (&dl_b->lock); +__dl_sub (dl_b, p->dl.dl_bw,cpumask_weight (rq->rd->span)); +raw_spin_unlock (&dl_b->lock); + + dl_b = &later_rq->rd->dl_bw; +raw_spin_lock (&dl_b->lock); +__dl_add (dl_b, p->dl.dl_bw,cpumask_weight (later_rq->rd->span)); +raw_spin_unlock (&dl_b->lock); +set_task_cpu (p, later_rq->cpu);double_unlock_balance (later_rq, rq);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 66/344 x86/reboot: Always use NMI fallback when shutdown via reboot vector IPI fails
In reply to Greg Kroah-HartmanFrom: Grzegorz Halat <[email protected]>
[ Upstream commit 747d5a1bf293dcb33af755a6d285d41b8c1ea010 ]
A reboot request sends an IPI via the reboot vector and waits for all other CPUs to stop. If one or more CPUs are in critical regions with interrupts disabled then the IPI is not handled on those CPUs and the shutdown hangs if native_stop_other_cpus() is called with the wait argument set.
Such a situation can happen when one CPU was stopped within a lock held section and another CPU is trying to acquire that lock with interrupts disabled. There are other scenarios which can cause such a lockup as well.
In theory the shutdown should be attempted by an NMI IPI after the timeout period elapsed. Though the wait loop after sending the reboot vector IPI prevents this. It checks the wait request argument and the timeout. If wait is set, which is true for sys_reboot() then it won't fall through to the NMI shutdown method after the timeout period has finished.
This was an oversight when the NMI shutdown mechanism was added to handle the 'reboot IPI is not working' situation. The mechanism was added to deal with stuck panic shutdowns, which do not have the wait request set, so the 'wait request' case was probably not considered.
Remove the wait check from the post reboot vector IPI wait loop and enforce that the wait loop in the NMI fallback path is invoked even if NMI IPIs are disabled or the registration of the NMI handler fails. That second wait loop will then hang if not all CPUs shutdown and the wait argument is set.
[ tglx: Avoid the hard to parse line break in the NMI fallback path,
add comments and massage the changelog ]
--- arch/x86/kernel/smp.c | 46 +++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 19 deletions(-)
arch/x86/kernel/smp.c +27 -19
@@ -179,6 +179,12 @@ asmlinkage __visible void smp_reboot_interrupt(void)irq_exit (); } +static int register_stop_handler (void ) +{ +return register_nmi_handler (NMI_LOCAL , smp_stop_nmi_callback, +NMI_FLAG_FIRST ,"smp_stop" ); +} +static void native_stop_other_cpus (int wait) {unsigned long flags;
@@ -212,39 +218,41 @@ static void native_stop_other_cpus(int wait) apic->send_IPI_allbutself (REBOOT_VECTOR );/* -* Don't wait longer than a second if the caller -* didn't ask us to wait. +* Don't wait longer than a second for IPI completion. The +* wait request is not checked here because that would +* prevent an NMI shutdown attempt in case that not all +* CPUs reach shutdown state. */ timeout =USEC_PER_SEC ; -while (num_online_cpus () >1 && (wait || timeout--)) +while (num_online_cpus () >1 && timeout--)udelay (1 ); } - -/* if the REBOOT_VECTOR didn't work, try with the NMI */ -if ((num_online_cpus () >1 ) && (!smp_no_nmi_ipi)) { -if (register_nmi_handler (NMI_LOCAL , smp_stop_nmi_callback, -NMI_FLAG_FIRST ,"smp_stop" )) -/* Note: we ignore failures here */ -/* Hope the REBOOT_IRQ is good enough */ - goto finish; - -/* sync above data before sending IRQ */ -wmb (); -pr_emerg ("Shutting down cpus with NMI\n" ); +/* if the REBOOT_VECTOR didn't work, try with the NMI */ +if (num_online_cpus () >1 ) { +/* +* If NMI IPI is enabled, try to register the stop handler +* and send the IPI. In any case try to wait for the other +* CPUs to stop. +*/ +if (!smp_no_nmi_ipi && !register_stop_handler ()) { +/* Sync above data before sending IRQ */ +wmb (); - apic->send_IPI_allbutself (NMI_VECTOR ); +pr_emerg ("Shutting down cpus with NMI\n" ); + apic->send_IPI_allbutself (NMI_VECTOR ); + }/* -* Don't wait longer than a 10 ms if the caller -* didn't ask us to wait. +* Don't wait longer than 10 ms if the caller didn't +* reqeust it. If wait is true, the machine hangs here if +* one or more CPUs do not reach shutdown state. */ timeout =USEC_PER_MSEC *10 ;while (num_online_cpus () >1 && (wait || timeout--))udelay (1 ); } -finish:local_irq_save (flags);disable_local_APIC ();mcheck_cpu_clear (this_cpu_ptr (&cpu_info));
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 67/344 rcu/tree: Call setschedule() gp ktread to SCHED_FIFO outside of atomic region
In reply to Greg Kroah-HartmanFrom: Juri Lelli <[email protected]>
[ Upstream commit 1a763fd7c6335e3122c1cc09576ef6c99ada4267 ]
sched_setscheduler() needs to acquire cpuset_rwsem, but it is currently called from an invalid (atomic) context by rcu_spawn_gp_kthread().
Fix that by simply moving sched_setscheduler_nocheck() call outside of the atomic region, as it doesn't actually require to be guarded by rcu_node lock.
--- kernel/rcu/tree.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/rcu/tree.c +3 -3
@@ -3234,13 +3234,13 @@ static int __init rcu_spawn_gp_kthread(void) t =kthread_create (rcu_gp_kthread,NULL ,"%s" , rcu_state.name);if (WARN_ONCE (IS_ERR (t),"%s: Could not start grace-period kthread, OOM is now expected behavior\n" , __func__))return 0 ; +if (kthread_prio) +sched_setscheduler_nocheck (t,SCHED_FIFO , &sp); rnp =rcu_get_root ();raw_spin_lock_irqsave_rcu_node (rnp, flags); rcu_state.gp_kthread = t; -if (kthread_prio) { +if (kthread_prio) sp.sched_priority = kthread_prio; -sched_setscheduler_nocheck (t,SCHED_FIFO , &sp); - }raw_spin_unlock_irqrestore_rcu_node (rnp, flags);wake_up_process (t);rcu_spawn_nocb_kthreads ();
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 68/344 x86/apic: Soft disable APIC before initializing it
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit 2640da4cccf5cc613bf26f0998b9e340f4b5f69c ]
If the APIC was already enabled on entry of setup_local_APIC() then disabling it soft via the SPIV register makes a lot of sense.
That masks all LVT entries and brings it into a well defined state.
Otherwise previously enabled LVTs which are not touched in the setup function stay unmasked and might surprise the just booting kernel.
--- arch/x86/kernel/apic/apic.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/x86/kernel/apic/apic.c +8 -0
@@ -1583,6 +1583,14 @@ static void setup_local_APIC(void)return ; } +/* +* If this comes from kexec/kcrash the APIC might be enabled in +* SPIV. Soft disable it before doing further initialization. +*/ + value =apic_read (APIC_SPIV ); + value &= ~APIC_SPIV_APIC_ENABLED ; +apic_write (APIC_SPIV , value); +#ifdef CONFIG_X86_32 /* Pound the ESR really hard over the head with a big hammer - mbligh */ if (lapic_is_integrated () && apic->disable_esr) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 69/344 ALSA: hda - Show the fatal CORB/RIRB error more clearly
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit dd65f7e19c6961ba6a69f7c925021b7a270cb950 ]
The last fallback of CORB/RIRB communication error recovery is to turn on the single command mode, and this last resort usually means that something is really screwed up. Instead of a normal dev_err(), show the error more clearly with dev_WARN() with the caller stack trace.
Also, show the bus-reset fallback also as an error, too.
--- sound/pci/hda/hda_controller.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
sound/pci/hda/hda_controller.c +4 -1
@@ -869,10 +869,13 @@ static int azx_rirb_get_response(struct hdac_bus *bus, unsigned int addr,*/ if (hbus->allow_bus_reset && !hbus->response_reset && !hbus->in_reset) { hbus->response_reset =1 ; +dev_err (chip->card->dev, +"No response from codec, resetting bus: last cmd=0x%08x\n" , + bus->last_cmd[addr]);return -EAGAIN ;/* give a chance to retry */ } -dev_err (chip->card->dev, +dev_WARN (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 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 70/344 ALSA: i2c: ak4xxx-adda: Fix a possible null pointer dereference in build_adc_controls()
In reply to Greg Kroah-HartmanFrom: Jia-Ju Bai <[email protected]>
[ Upstream commit 2127c01b7f63b06a21559f56a8c81a3c6535bd1a ]
In build_adc_controls(), there is an if statement on line 773 to check whether ak->adc_info is NULL:
if (! ak->adc_info ||
! ak->adc_info[mixer_ch].switch_name)When ak->adc_info is NULL, it is used on line 792:
knew.name = ak->adc_info[mixer_ch].selector_name;
Thus, a possible null-pointer dereference may occur.
To fix this bug, referring to lines 773 and 774, ak->adc_info and ak->adc_info[mixer_ch].selector_name are checked before being used.
This bug is found by a static analysis tool STCheck written by us.
--- sound/i2c/other/ak4xxx-adda.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
sound/i2c/other/ak4xxx-adda.c +4 -3
@@ -775,11 +775,12 @@ static int build_adc_controls(struct snd_akm4xxx *ak)return err;memset (&knew,0 ,sizeof (knew)); - knew.name = ak->adc_info[mixer_ch].selector_name; -if (!knew.name) { +if (!ak->adc_info || + !ak->adc_info[mixer_ch].selector_name) { knew.name ="Capture Channel" ; knew.index = mixer_ch + ak->idx_offset *2 ; - } + }else + knew.name = ak->adc_info[mixer_ch].selector_name; knew.iface =SNDRV_CTL_ELEM_IFACE_MIXER ; knew.info = ak4xxx_capture_source_info;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 71/344 rcu: Add destroy_work_on_stack() to match INIT_WORK_ONSTACK()
In reply to Greg Kroah-HartmanFrom: Paul E. McKenney <[email protected]>
[ Upstream commit fbad01af8c3bb9618848abde8054ab7e0c2330fe ]
The synchronize_rcu_expedited() function has an INIT_WORK_ONSTACK(), but lacks the corresponding destroy_work_on_stack(). This commit therefore adds destroy_work_on_stack().
--- kernel/rcu/tree_exp.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
kernel/rcu/tree_exp.h +5 -1
@@ -792,6 +792,7 @@ static int rcu_print_task_exp_stall(struct rcu_node *rnp)*/ void synchronize_rcu_expedited (void ) { +bool boottime = (rcu_scheduler_active ==RCU_SCHEDULER_INIT );struct rcu_exp_work rew;struct rcu_node *rnp;unsigned long s;
@@ -817,7 +818,7 @@ void synchronize_rcu_expedited(void)return ;/* Someone else did our work for us. */ /* Ensure that load happens before action based on it. */ -if (unlikely (rcu_scheduler_active ==RCU_SCHEDULER_INIT )) { +if (unlikely (boottime)) {/* Direct call during scheduler init and early_initcalls(). */ rcu_exp_sel_wait_wake (s); }else {
@@ -835,5 +836,8 @@ void synchronize_rcu_expedited(void)/* Let the next expedited grace period start. */ mutex_unlock (&rcu_state.exp_mutex); + +if (likely (!boottime)) +destroy_work_on_stack (&rew.rew_work); }EXPORT_SYMBOL_GPL (synchronize_rcu_expedited);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 72/344 EDAC/mc: Fix grain_bits calculation
In reply to Greg Kroah-HartmanFrom: Robert Richter <[email protected]>
[ Upstream commit 3724ace582d9f675134985727fd5e9811f23c059 ]
The grain in EDAC is defined as "minimum granularity for an error report, in bytes". The following calculation of the grain_bits in edac_mc is wrong:
grain_bits = fls_long(e->grain) + 1;
Where grain_bits is defined as:
grain = 1 << grain_bits
Example:
grain = 8 # 64 bit (8 bytes) grain_bits = fls_long(8) + 1 grain_bits = 4 + 1 = 5 grain = 1 << grain_bits grain = 1 << 5 = 32
Replace it with the correct calculation:
grain_bits = fls_long(e->grain - 1);
The example gives now:
grain_bits = fls_long(8 - 1) grain_bits = fls_long(7) grain_bits = 3 grain = 1 << 3 = 8
Also, check if the hardware reports a reasonable grain != 0 and fallback with a warning to 1 byte granularity otherwise.
[ bp: massage a bit. ]
--- drivers/edac/edac_mc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/edac/edac_mc.c +6 -2
@@ -1235,9 +1235,13 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,if (p > e->location) *(p -1 ) ='\0' ; -/* Report the error via the trace interface */ - grain_bits =fls_long (e->grain) +1 ; +/* Sanity-check driver-supplied grain value. */ +if (WARN_ON_ONCE (!e->grain)) + e->grain =1 ; + + grain_bits =fls_long (e->grain -1 ); +/* Report the error via the trace interface */ if (IS_ENABLED (CONFIG_RAS )) trace_mc_event(type, e->msg, e->label, e->error_count, mci->mc_idx, e->top_layer, e->mid_layer,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 73/344 arm64: dts: imx8mq: Correct OPP table according to latest datasheet
In reply to Greg Kroah-HartmanFrom: Anson Huang <[email protected]>
[ Upstream commit 9eced3a2f224a62a233761e8af18c907c532e192 ]
According to latest datasheet (Rev.1, 10/2018) from below links, in the consumer datasheet, 1.5GHz is mentioned as highest opp but depends on speed grading fuse, and in the industrial datasheet, 1.3GHz is mentioned as highest opp but depends on speed grading fuse. 1.5GHz and 1.3GHz opp use same voltage, so no need for consumer part to support 1.3GHz opp, with same voltage, CPU should run at highest frequency in order to go into idle as quick as possible, this can save power.
That means for consumer part, 1GHz/1.5GHz are supported, for industrial part, 800MHz/1.3GHz are supported, and then check the speed grading fuse to limit the highest CPU frequency further. Correct the market segment bits in opp table to make them work according to datasheets.
https://www.nxp.com/docs/en/data-sheet/IMX8MDQLQIEC.pdf
https://www.nxp.com/docs/en/data-sheet/IMX8MDQLQCEC.pdf
--- arch/arm64/boot/dts/freescale/imx8mq.dtsi | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/freescale/imx8mq.dtsi +2 -3
@@ -169,15 +169,14 @@ opp-1300000000 { opp-hz = /bits/ 64 <1300000000>; opp-microvolt = <1000000>; - opp-supported-hw = <0xc>, <0x7>; + opp-supported-hw = <0xc>, <0x4>; clock-latency-ns = <150000>; }; opp-1500000000 { opp-hz = /bits/ 64 <1500000000>; opp-microvolt = <1000000>; - /* Consumer only but rely on speed grading */ - opp-supported-hw = <0x8>, <0x7>; + opp-supported-hw = <0x8>, <0x3>; clock-latency-ns = <150000>; }; };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 74/344 media: iguanair: add sanity checks
In reply to Greg Kroah-HartmanFrom: Oliver Neukum <[email protected]>
[ Upstream commit ab1cbdf159beba7395a13ab70bc71180929ca064 ]
The driver needs to check the endpoint types, too, as opposed to the number of endpoints. This also requires moving the check earlier.
--- drivers/media/rc/iguanair.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
drivers/media/rc/iguanair.c +7 -8
@@ -413,6 +413,10 @@ static int iguanair_probe(struct usb_interface *intf,int ret, pipein, pipeout;struct usb_host_interface *idesc; + idesc = intf->altsetting; +if (idesc->desc.bNumEndpoints <2 ) +return -ENODEV ; + ir =kzalloc (sizeof (*ir),GFP_KERNEL ); rc =rc_allocate_device (RC_DRIVER_IR_RAW );if (!ir || !rc) {
@@ -427,18 +431,13 @@ static int iguanair_probe(struct usb_interface *intf, ir->urb_in =usb_alloc_urb (0 ,GFP_KERNEL ); ir->urb_out =usb_alloc_urb (0 ,GFP_KERNEL ); -if (!ir->buf_in || !ir->packet || !ir->urb_in || !ir->urb_out) { +if (!ir->buf_in || !ir->packet || !ir->urb_in || !ir->urb_out || + !usb_endpoint_is_int_in (&idesc->endpoint[0 ].desc) || + !usb_endpoint_is_int_out (&idesc->endpoint[1 ].desc)) { ret = -ENOMEM ; goto out; } - idesc = intf->altsetting; - -if (idesc->desc.bNumEndpoints <2 ) { - ret = -ENODEV ; - goto out; - } - ir->rc = rc; ir->dev = &intf->dev; ir->udev = udev;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 75/344 cpuidle: teo: Allow tick to be stopped if PM QoS is used
In reply to Greg Kroah-HartmanFrom: Rafael J. Wysocki <[email protected]>
[ Upstream commit cab09f3d2d2a0a6cb3dfb678660d67a2c3764f50 ]
The TEO goveror prevents the scheduler tick from being stopped (unless stopped already) if there is a PM QoS latency constraint for the given CPU and the target residency of the deepest idle state matching that constraint is below the tick boundary.
However, that is problematic if CPUs with PM QoS latency constraints are idle for long times, because it effectively causes the tick to run on them all the time which is wasteful. [It is also confusing and questionable if they are full dynticks CPUs.]
To address that issue, modify the TEO governor to carry out the entire search for the most suitable idle state (from the target residency perspective) even if a latency constraint is present, to allow it to determine the expected idle duration in all cases.
Also, when using the last several measured idle duration values to refine the idle state selection, make it compare those values with the current expected idle duration value (instead of comparing them with the target residency of the idle state selected so far) which should prevent the tick from being retained when it makes sense to stop it sometimes (especially in the presence of PM QoS latency constraints).
--- drivers/cpuidle/governors/teo.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-)
drivers/cpuidle/governors/teo.c +16 -16
@@ -242,7 +242,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,struct teo_cpu *cpu_data =per_cpu_ptr (&teo_cpus, dev->cpu);int latency_req =cpuidle_governor_latency_req (dev->cpu);unsigned int duration_us, count; -int max_early_idx, idx, i; +int max_early_idx, constraint_idx, idx, i;ktime_t delta_tick;if (cpu_data->last_state >=0 ) {
@@ -257,6 +257,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, count =0 ; max_early_idx =-1 ; + constraint_idx = drv->state_count; idx =-1 ;for (i =0 ; i < drv->state_count; i++) {
@@ -286,16 +287,8 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,if (s->target_residency > duration_us)break ; -if (s->exit_latency > latency_req) { -/* -* If we break out of the loop for latency reasons, use -* the target residency of the selected state as the -* expected idle duration to avoid stopping the tick -* as long as that target residency is low enough. -*/ - duration_us = drv->states[idx].target_residency; - goto refine; - } +if (s->exit_latency > latency_req && constraint_idx > i) + constraint_idx = i; idx = i;
@@ -321,7 +314,13 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, duration_us = drv->states[idx].target_residency; } -refine: +/* +* If there is a latency constraint, it may be necessary to use a +* shallower idle state than the one selected so far. +*/ +if (constraint_idx < idx) + idx = constraint_idx; +if (idx <0 ) { idx =0 ;/* No states enabled. Must use 0. */ }else if (idx >0 ) {
@@ -331,13 +330,12 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,/* * Count and sum the most recent idle duration values less than -* the target residency of the state selected so far, find the -* max. +* the current expected idle duration value. */ for (i =0 ; i <INTERVALS ; i++) {unsigned int val = cpu_data->intervals[i]; -if (val >= drv->states[idx].target_residency) +if (val >= duration_us)continue ; count++;
@@ -356,8 +354,10 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,* would be too shallow. */ if (!(tick_nohz_tick_stopped () && avg_us <TICK_USEC )) { - idx =teo_find_shallower_state (drv, dev, idx, avg_us); duration_us = avg_us; +if (drv->states[idx].target_residency > avg_us) + idx =teo_find_shallower_state (drv, dev, + idx, avg_us); } } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 76/344 gpio: madera: Add support for Cirrus Logic CS47L15
In reply to Greg Kroah-HartmanFrom: Richard Fitzgerald <[email protected]>
[ Upstream commit d06be8bc290aa255b9fd8602e60fb9f487aa0f48 ]
As the gpio is common to all madera codecs all that is needed is to setup the correct number of GPIO pins for the CS47L15.
--- drivers/gpio/gpio-madera.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpio/gpio-madera.c +3 -0
@@ -136,6 +136,9 @@ static int madera_gpio_probe(struct platform_device *pdev) madera_gpio->gpio_chip.parent = pdev->dev.parent;switch (madera->type) { +case CS47L15 : + madera_gpio->gpio_chip.ngpio =CS47L15_NUM_GPIOS ; +break ;case CS47L35 : madera_gpio->gpio_chip.ngpio =CS47L35_NUM_GPIOS ;break ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 77/344 gpio: madera: Add support for Cirrus Logic CS47L92
In reply to Greg Kroah-HartmanFrom: Charles Keepax <[email protected]>
[ Upstream commit 74d2d0e68701bcd53d2cf771dd3b3cb9f84bed5c ]
As the gpio is common to all madera codecs all that is needed is to setup the correct number of GPIO pins for the CS47L92.
--- drivers/gpio/gpio-madera.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpio/gpio-madera.c +5 -0
@@ -150,6 +150,11 @@ static int madera_gpio_probe(struct platform_device *pdev)case CS47L91 : madera_gpio->gpio_chip.ngpio =CS47L90_NUM_GPIOS ;break ; +case CS42L92 : +case CS47L92 : +case CS47L93 : + madera_gpio->gpio_chip.ngpio =CS47L92_NUM_GPIOS ; +break ;default :dev_err (&pdev->dev,"Unknown chip variant %d\n" , madera->type);return -EINVAL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 78/344 arm64: mm: free the initrd reserved memblock in a aligned manner
In reply to Greg Kroah-HartmanFrom: Junhua Huang <[email protected]>
[ Upstream commit 13776f9d40a028a245bb766269e360f5b7a62721 ]
We should free the initrd reserved memblock in an aligned manner, because the initrd reserves the memblock in an aligned manner in arm64_memblock_init().
Otherwise there are some fragments in memblock_reserved regions after free_initrd_mem(). e.g.:/sys/kernel/debug/memblock # cat reserved
0: 0x0000000080080000..0x00000000817fafff
1: 0x0000000083400000..0x0000000083ffffff
2: 0x0000000090000000..0x000000009000407f
3: 0x00000000b0000000..0x00000000b000003f
4: 0x00000000b26184ea..0x00000000b2618fff
The fragments like the ranges from b0000000 to b000003f and from b26184ea to b2618fff should be freed.
And we can do free_reserved_area() after memblock_free(), as free_reserved_area() calls __free_pages(), once we've done that it could be allocated somewhere else,
but memblock and iomem still say this is reserved memory.
--- arch/arm64/mm/init.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/arm64/mm/init.c +5 -1
@@ -570,8 +570,12 @@ void free_initmem(void)#ifdef CONFIG_BLK_DEV_INITRD void __init free_initrd_mem (unsigned long start,unsigned long end) { +unsigned long aligned_start, aligned_end; + + aligned_start =__virt_to_phys (start) &PAGE_MASK ; + aligned_end =PAGE_ALIGN (__virt_to_phys (end)); +memblock_free (aligned_start, aligned_end - aligned_start);free_reserved_area ((void *)start, (void *)end,0 ,"initrd" ); -memblock_free (__virt_to_phys (start), end - start); }#endif
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 79/344 soc: amlogic: meson-clk-measure: protect measure with a mutex
In reply to Greg Kroah-HartmanFrom: Neil Armstrong <[email protected]>
[ Upstream commit 3a760d986568b67d1f8411dab64608075817b90d ]
In order to protect clock measuring when multiple process asks for a measure, protect the main measure function with mutexes.
--- drivers/soc/amlogic/meson-clk-measure.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/soc/amlogic/meson-clk-measure.c +11 -1
@@ -11,6 +11,8 @@#include <linux/debugfs.h> #include <linux/regmap.h> +static DEFINE_MUTEX (measure_lock); +#define MSR_CLK_DUTY 0x0#define MSR_CLK_REG0 0x4#define MSR_CLK_REG1 0x8
@@ -360,6 +362,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,unsigned int val;int ret; + ret =mutex_lock_interruptible (&measure_lock); +if (ret) +return ret; +regmap_write (priv->regmap,MSR_CLK_REG0 ,0 );/* Set measurement duration */
@@ -377,8 +383,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id, ret =regmap_read_poll_timeout (priv->regmap,MSR_CLK_REG0 , val, !(val &MSR_BUSY ),10 ,10000 ); -if (ret) +if (ret) { +mutex_unlock (&measure_lock);return ret; + }/* Disable */ regmap_update_bits (priv->regmap,MSR_CLK_REG0 ,MSR_ENABLE ,0 );
@@ -386,6 +394,8 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,/* Get the value in multiple of gate time counts */ regmap_read (priv->regmap,MSR_CLK_REG2 , &val); +mutex_unlock (&measure_lock); +if (val >=MSR_VAL_MASK )return -EINVAL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 80/344 base: soc: Export soc_device_register/unregister APIs
In reply to Greg Kroah-HartmanFrom: Vinod Koul <[email protected]>
[ Upstream commit f7ccc7a397cf2ef64aebb2f726970b93203858d2 ]
Qcom Socinfo driver can be built as a module, so
export these two APIs.
--- drivers/base/soc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/base/soc.c +2 -0
@@ -157,6 +157,7 @@ struct soc_device *soc_device_register(struct soc_device_attribute *soc_dev_attr out1:return ERR_PTR (ret); } +EXPORT_SYMBOL_GPL (soc_device_register);/* Ensure soc_dev->attr is freed prior to calling soc_device_unregister. */ void soc_device_unregister (struct soc_device *soc_dev)
@@ -166,6 +167,7 @@ void soc_device_unregister(struct soc_device *soc_dev)device_unregister (&soc_dev->dev); early_soc_dev_attr =NULL ; } +EXPORT_SYMBOL_GPL (soc_device_unregister);static int __init soc_bus_register (void ) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 81/344 ALSA: usb-audio: Skip bSynchAddress endpoint check if it is invalid
In reply to Greg Kroah-HartmanFrom: Ard van Breemen <[email protected]>
[ Upstream commit 1b34121d9f26d272b0b2334209af6b6fc82d4bf1 ]
The Linux kernel assumes that get_endpoint(alts,0) and get_endpoint(alts,1) are eachothers feedback endpoints.
To reassure that validity it will test bsynchaddress to comply with that assumption. But if the bsyncaddress is 0 (invalid), it will flag that as a wrong assumption and return an error.
Fix: Skip the test if bSynchAddress is 0.
Note: those with a valid bSynchAddress should have a code quirck added.
--- sound/usb/pcm.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/pcm.c +1 -0
@@ -457,6 +457,7 @@ static int set_sync_endpoint(struct snd_usb_substream *subs, } ep =get_endpoint (alts,1 )->bEndpointAddress;if (get_endpoint (alts,0 )->bLength >=USB_DT_ENDPOINT_AUDIO_SIZE && +get_endpoint (alts,0 )->bSynchAddress !=0 && ((is_playback && ep != (unsigned int )(get_endpoint (alts,0 )->bSynchAddress |USB_DIR_IN )) || (!is_playback && ep != (unsigned int )(get_endpoint (alts,0 )->bSynchAddress & ~USB_DIR_IN )))) { dev_err(&dev->dev,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 82/344 ia64:unwind: fix double free for mod->arch.init_unw_table
In reply to Greg Kroah-HartmanFrom: chenzefeng <[email protected]>
[ Upstream commit c5e5c48c16422521d363c33cfb0dcf58f88c119b ]
The function free_module in file kernel/module.c as follow:
void free_module(struct module *mod) {
......
module_arch_cleanup(mod);
......
module_arch_freeing_init(mod);
......
}Both module_arch_cleanup and module_arch_freeing_init function would free the mod->arch.init_unw_table, which cause double free.
Here, set mod->arch.init_unw_table = NULL after remove the unwind table to avoid double free.
--- arch/ia64/kernel/module.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
arch/ia64/kernel/module.c +6 -2
@@ -914,10 +914,14 @@ module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *movoid module_arch_cleanup (struct module *mod) { -if (mod->arch.init_unw_table) +if (mod->arch.init_unw_table) {unw_remove_unwind_table (mod->arch.init_unw_table); -if (mod->arch.core_unw_table) + mod->arch.init_unw_table =NULL ; + } +if (mod->arch.core_unw_table) {unw_remove_unwind_table (mod->arch.core_unw_table); + mod->arch.core_unw_table =NULL ; + } }void *dereference_module_function_descriptor (struct module *mod,void *ptr)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 83/344 EDAC/altera: Use the proper type for the IRQ status bits
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 8faa1cf6ed82f33009f63986c3776cc48af1b7b2 ]
Smatch complains about the cast of a u32 pointer to unsigned long:
drivers/edac/altera_edac.c:1878 altr_edac_a10_irq_handler()
warn: passing casted pointer '&irq_status' to 'find_first_bit()'
This code wouldn't work on a 64 bit big endian system because it would read past the end of &irq_status.
[ bp: massage. ]
--- drivers/edac/altera_edac.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/edac/altera_edac.c +3 -1
@@ -1866,6 +1866,7 @@ static void altr_edac_a10_irq_handler(struct irq_desc *desc)struct altr_arria10_edac *edac =irq_desc_get_handler_data (desc);struct irq_chip *chip =irq_desc_get_chip (desc);int irq =irq_desc_get_irq (desc); +unsigned long bits; dberr = (irq = edac->db_irq) ?1 :0 ; sm_offset = dberr ? A10_SYSMGR_ECC_INTSTAT_DERR_OFST :
@@ -1875,7 +1876,8 @@ static void altr_edac_a10_irq_handler(struct irq_desc *desc)regmap_read (edac->ecc_mgr_map, sm_offset, &irq_status); -for_each_set_bit (bit, (unsigned long *)&irq_status,32 ) { + bits = irq_status; +for_each_set_bit (bit, &bits,32 ) { irq =irq_linear_revmap (edac->domain, dberr *32 + bit);if (irq)generic_handle_irq (irq);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 84/344 ASoC: rsnd: dont call clk_get_rate() under atomic context
In reply to Greg Kroah-HartmanFrom: Kuninori Morimoto <[email protected]>
[ Upstream commit 06e8f5c842f2dbb232897ba967ea7b422745c271 ]
ADG is using clk_get_rate() under atomic context, thus, we might have scheduling issue.
To avoid this issue, we need to get/keep clk rate under non atomic context.
We need to handle ADG as special device at Renesas Sound driver.
Quoted 1 line
From SW point of view, we want to impletent it as
rsnd_mod_ops :: prepare, but it makes code just complicate.
To avoid complicated code/patch, this patch adds new clk_rate[] array, and keep clk IN rate when rsnd_adg_clk_enable() was called.
--- sound/soc/sh/rcar/adg.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
sound/soc/sh/rcar/adg.c +15 -6
@@ -30,6 +30,7 @@ struct rsnd_adg {struct clk *clkout[CLKOUTMAX ];struct clk_onecell_data onecell;struct rsnd_mod mod; +int clk_rate[CLKMAX ];u32 flags;u32 ckr;u32 rbga;
@@ -114,9 +115,9 @@ static void __rsnd_adg_get_timesel_ratio(struct rsnd_priv *priv,unsigned int val, en;unsigned int min, diff;unsigned int sel_rate[] = { -clk_get_rate (adg->clk[CLKA ]),/* 0000: CLKA */ -clk_get_rate (adg->clk[CLKB ]),/* 0001: CLKB */ -clk_get_rate (adg->clk[CLKC ]),/* 0010: CLKC */ + adg->clk_rate[CLKA ],/* 0000: CLKA */ + adg->clk_rate[CLKB ],/* 0001: CLKB */ + adg->clk_rate[CLKC ],/* 0010: CLKC */ adg->rbga_rate_for_441khz,/* 0011: RBGA */ adg->rbgb_rate_for_48khz,/* 0100: RBGB */ };
@@ -302,7 +303,7 @@ int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate)* AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC/AUDIO_CLKI. */ for_each_rsnd_clk (clk, adg, i) { -if (rate ==clk_get_rate (clk)) +if (rate == adg->clk_rate[i])return sel_table[i]; }
@@ -369,10 +370,18 @@ void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable)for_each_rsnd_clk (clk, adg, i) { ret =0 ; -if (enable) +if (enable) { ret =clk_prepare_enable (clk); -else + +/* +* We shouldn't use clk_get_rate() under +* atomic context. Let's keep it when +* rsnd_adg_clk_enable() was called +*/ + adg->clk_rate[i] =clk_get_rate (adg->clk[i]); + }else {clk_disable_unprepare (clk); + }if (ret <0 )dev_warn (dev,"can't use clk %d\n" , i);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 85/344 arm64/prefetch: fix a -Wtype-limits warning
In reply to Greg Kroah-HartmanFrom: Qian Cai <[email protected]>
[ Upstream commit b99286b088ea843b935dcfb29f187697359fe5cd ]
The commit d5370f754875 ("arm64: prefetch: add alternative pattern for CPUs without a prefetcher") introduced MIDR_IS_CPU_MODEL_RANGE() to be used in has_no_hw_prefetch() with rv_min=0 which generates a compilation warning from GCC,
In file included from ./arch/arm64/include/asm/cache.h:8,
from ./include/linux/cache.h:6,
from ./include/linux/printk.h:9,
from ./include/linux/kernel.h:15,
from ./include/linux/cpumask.h:10,
from arch/arm64/kernel/cpufeature.c:11:
arch/arm64/kernel/cpufeature.c: In function 'has_no_hw_prefetch':
./arch/arm64/include/asm/cputype.h:59:26: warning: comparison of
unsigned expression >= 0 is always true [-Wtype-limits]
_model == (model) && rv >= (rv_min) && rv <= (rv_max); \
^~
arch/arm64/kernel/cpufeature.c:889:9: note: in expansion of macro
'MIDR_IS_CPU_MODEL_RANGE'
return MIDR_IS_CPU_MODEL_RANGE(midr, MIDR_THUNDERX,
^~~~~~~~~~~~~~~~~~~~~~~Fix it by converting MIDR_IS_CPU_MODEL_RANGE to a static inline function.
--- arch/arm64/include/asm/cputype.h | 21 +++++++++++---------- arch/arm64/kernel/cpufeature.c | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-)
arch/arm64/include/asm/cputype.h +11 -10
@@ -51,14 +51,6 @@#define MIDR_CPU_MODEL_MASK (MIDR_IMPLEMENTOR_MASK | MIDR_PARTNUM_MASK | \ MIDR_ARCHITECTURE_MASK) -#define MIDR_IS_CPU_MODEL_RANGE (midr, model, rv_min, rv_max) \ -({ \ - u32 _model = (midr) & MIDR_CPU_MODEL_MASK; \ - u32 rv = (midr) & (MIDR_REVISION_MASK | MIDR_VARIANT_MASK); \ - \ - _model == (model) && rv >= (rv_min) && rv <= (rv_max); \ - }) -#define ARM_CPU_IMP_ARM 0x41#define ARM_CPU_IMP_APM 0x50#define ARM_CPU_IMP_CAVIUM 0x43
@@ -159,10 +151,19 @@ struct midr_range {#define MIDR_REV (m, v, r) MIDR_RANGE(m, v, r, v, r)#define MIDR_ALL_VERSIONS (m) MIDR_RANGE(m, 0, 0, 0xf, 0xf) +static inline bool midr_is_cpu_model_range (u32 midr,u32 model,u32 rv_min, +u32 rv_max) +{ +u32 _model = midr &MIDR_CPU_MODEL_MASK ; +u32 rv = midr & (MIDR_REVISION_MASK |MIDR_VARIANT_MASK ); + +return _model == model && rv >= rv_min && rv <= rv_max; +} +static inline bool is_midr_in_range (u32 midr,struct midr_range const *range) { -return MIDR_IS_CPU_MODEL_RANGE (midr, range->model, - range->rv_min, range->rv_max); +return midr_is_cpu_model_range (midr, range->model, + range->rv_min, range->rv_max); } static inline bool
arch/arm64/kernel/cpufeature.c +1 -1
@@ -894,7 +894,7 @@ static bool has_no_hw_prefetch(const struct arm64_cpu_capabilities *entry, int _u32 midr =read_cpuid_id ();/* Cavium ThunderX pass 1.x and 2.x */ -return MIDR_IS_CPU_MODEL_RANGE (midr,MIDR_THUNDERX , +return midr_is_cpu_model_range (midr,MIDR_THUNDERX ,MIDR_CPU_VAR_REV (0 ,0 ),MIDR_CPU_VAR_REV (1 ,MIDR_REVISION_MASK )); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 86/344 md/raid1: end bio when the device faulty
In reply to Greg Kroah-HartmanFrom: Yufen Yu <[email protected]>
[ Upstream commit eeba6809d8d58908b5ed1b5ceb5fcb09a98a7cad ]
When write bio return error, it would be added to conf->retry_list and wait for raid1d thread to retry write and acknowledge badblocks.
In narrow_write_error(), the error bio will be split in the unit of badblock shift (such as one sector) and raid1d thread issues them one by one. Until all of the splited bio has finished, raid1d thread can go on processing other things, which is time consuming.
But, there is a scene for error handling that is not necessary. When the device has been set faulty, flush_bio_list() may end bios in pending_bio_list with error status. Since these bios has not been issued to the device actually, error handlding to retry write and acknowledge badblocks make no sense.
Even without that scene, when the device is faulty, badblocks info can not be written out to the device. Thus, we also no need to handle the error IO.
--- drivers/md/raid1.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)
drivers/md/raid1.c +14 -12
@@ -447,19 +447,21 @@ static void raid1_end_write_request(struct bio *bio)/* We never try FailFast to WriteMostly devices */ !test_bit(WriteMostly, &rdev->flags)) {md_error (r1_bio->mddev, rdev); -if (!test_bit (Faulty, &rdev->flags)) -/* This is the only remaining device, -* We need to retry the write without -* FailFast -*/ -set_bit (R1BIO_WriteError, &r1_bio->state); -else { -/* Finished with this branch */ - r1_bio->bios[mirror] =NULL ; - to_put = bio; - } - } else + } + +/* +* When the device is faulty, it is not necessary to +* handle write error. +* For failfast, this is the only remaining device, +* We need to retry the write without FailFast. +*/ +if (!test_bit (Faulty, &rdev->flags))set_bit (R1BIO_WriteError, &r1_bio->state); +else { +/* Finished with this branch */ + r1_bio->bios[mirror] =NULL ; + to_put = bio; + } }else {/* * Set R1BIO_Uptodate in our master bio, so that we
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 87/344 md: dont call spare_active in md_reap_sync_thread if all member devices cant work
In reply to Greg Kroah-HartmanFrom: Guoqing Jiang <[email protected]>
[ Upstream commit 0d8ed0e9bf9643f27f4816dca61081784dedb38d ]
When add one disk to array, the md_reap_sync_thread is responsible to activate the spare and set In_sync flag for the new member in spare_active().
But if raid1 has one member disk A, and disk B is added to the array. Then we offline A before all the datas are synchronized from A to B, obviously B doesn't have the latest data as A, but B is still marked with In_sync flag.
So let's not call spare_active under the condition, otherwise B is still showed with 'U' state which is not correct.
--- drivers/md/md.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/md/md.c +2 -1
@@ -9043,7 +9043,8 @@ void md_reap_sync_thread(struct mddev *mddev)/* resync has finished, collect result */ md_unregister_thread (&mddev->sync_thread);if (!test_bit (MD_RECOVERY_INTR , &mddev->recovery) && - !test_bit (MD_RECOVERY_REQUESTED , &mddev->recovery)) { + !test_bit (MD_RECOVERY_REQUESTED , &mddev->recovery) && + mddev->degraded != mddev->raid_disks) {/* success...*/ /* activate any spares */ if (mddev->pers->spare_active (mddev)) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 88/344 md: dont set In_sync if array is frozen
In reply to Greg Kroah-HartmanFrom: Guoqing Jiang <[email protected]>
[ Upstream commit 062f5b2ae12a153644c765e7ba3b0f825427be1d ]
When a disk is added to array, the following path is called in mdadm.
Manage_subdevs -> sysfs_freeze_array
-> Manage_add
-> sysfs_set_str(&info, NULL, "sync_action","idle")Then from kernel side, Manage_add invokes the path (add_new_disk -> validate_super = super_1_validate) to set In_sync flag.
Since In_sync means "device is in_sync with rest of array", and the new added disk need to resync thread to help the synchronization of data. And md_reap_sync_thread would call spare_active to set In_sync for the new added disk finally. So don't set In_sync if array is in frozen.
--- drivers/md/md.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/md/md.c +9 -2
@@ -1826,8 +1826,15 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)if (!(le32_to_cpu (sb->feature_map) &MD_FEATURE_RECOVERY_BITMAP )) rdev->saved_raid_disk =-1 ; - }else -set_bit (In_sync, &rdev->flags); + }else { +/* +* If the array is FROZEN, then the device can't +* be in_sync with rest of array. +*/ +if (!test_bit (MD_RECOVERY_FROZEN , + &mddev->recovery)) +set_bit (In_sync, &rdev->flags); + } rdev->raid_disk = role;break ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 89/344 media: media/platform: fsl-viu.c: fix build for MICROBLAZE
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit 6898dd580a045341f844862ceb775144156ec1af ]
arch/microblaze/ defines out_be32() and in_be32(), so don't do that again in the driver source.
Fixes these build warnings:
../drivers/media/platform/fsl-viu.c:36: warning: "out_be32" redefined ../arch/microblaze/include/asm/io.h:50: note: this is the location of the previous definition ../drivers/media/platform/fsl-viu.c:37: warning: "in_be32" redefined ../arch/microblaze/include/asm/io.h:53: note: this is the location of the previous definition
--- drivers/media/platform/fsl-viu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/platform/fsl-viu.c +1 -1
@@ -32,7 +32,7 @@#define VIU_VERSION "0.5.1"/* Allow building this driver with COMPILE_TEST */ -#ifndef CONFIG_PPC +#if !defined(CONFIG_PPC ) && !defined(CONFIG_MICROBLAZE )#define out_be32 (v, a) iowrite32be(a, (void __iomem *)v)#define in_be32 (a) ioread32be((void __iomem *)a)#endif
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 90/344 media: staging: tegra-vde: Fix build error
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
[ Upstream commit 6b2265975239ab655069d796b822835a593e1cc7 ]
If IOMMU_SUPPORT is not set, and COMPILE_TEST is y, IOMMU_IOVA may be set to m. So building will fails:
drivers/staging/media/tegra-vde/iommu.o: In function `tegra_vde_iommu_map':
iommu.c:(.text+0x41): undefined reference to alloc_iova' iommu.c:(.text+0x56): undefined reference to __free_iova'
Select IOMMU_IOVA while COMPILE_TEST is set to fix this.
--- drivers/staging/media/tegra-vde/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/media/tegra-vde/Kconfig +1 -1
@@ -3,7 +3,7 @@ config TEGRA_VDE tristate "NVIDIA Tegra Video Decoder Engine driver" depends on ARCH_TEGRA || COMPILE_TEST select DMA_SHARED_BUFFER - select IOMMU_IOVA if IOMMU_SUPPORT + select IOMMU_IOVA if (IOMMU_SUPPORT || COMPILE_TEST) select SRAM help Say Y here to enable support for the NVIDIA Tegra video decoder
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 91/344 RAS: Fix prototype warnings
In reply to Greg Kroah-HartmanFrom: Valdis Klētnieks <[email protected]>
[ Upstream commit 0a54b809a3a2c31e1055b45b03708eb730222be1 ]
When building with C=2 and/or W=1, legitimate warnings are issued about missing prototypes:
CHECK drivers/ras/debugfs.c
drivers/ras/debugfs.c:4:15: warning: symbol 'ras_debugfs_dir' was not declared. Should it be static? drivers/ras/debugfs.c:8:5: warning: symbol 'ras_userspace_consumers' was not declared. Should it be static? drivers/ras/debugfs.c:38:12: warning: symbol 'ras_add_daemon_trace' was not declared. Should it be static? drivers/ras/debugfs.c:54:13: warning: symbol 'ras_debugfs_init' was not declared. Should it be static?
CC drivers/ras/debugfs.o
drivers/ras/debugfs.c:8:5: warning: no previous prototype for 'ras_userspace_consumers' [-Wmissing-prototypes]
8 | int ras_userspace_consumers(void)
| ^~~~~~~~~~~~~~~~~~~~~~~
drivers/ras/debugfs.c:38:12: warning: no previous prototype for 'ras_add_daemon_trace' [-Wmissing-prototypes]
38 | int __init ras_add_daemon_trace(void)
| ^~~~~~~~~~~~~~~~~~~~
drivers/ras/debugfs.c:54:13: warning: no previous prototype for 'ras_debugfs_init' [-Wmissing-prototypes]
54 | void __init ras_debugfs_init(void)
| ^~~~~~~~~~~~~~~~
Provide the proper includes.
[ bp: Take care of the same warnings for cec.c too. ]
--- drivers/ras/cec.c | 1 + drivers/ras/debugfs.c | 2 ++ 2 files changed, 3 insertions(+)
drivers/ras/cec.c +1 -0
@@ -4,6 +4,7 @@*/ #include <linux/mm.h> #include <linux/gfp.h> +#include <linux/ras.h> #include <linux/kernel.h> #include <linux/workqueue.h>
drivers/ras/debugfs.c +2 -0
@@ -1,5 +1,7 @@// SPDX-License-Identifier: GPL-2.0-only #include <linux/debugfs.h> +#include <linux/ras.h> +#include "debugfs.h" struct dentry *ras_debugfs_dir;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 92/344 RAS: Build debugfs.o only when enabled in Kconfig
In reply to Greg Kroah-HartmanFrom: Valdis Kletnieks <[email protected]>
[ Upstream commit b6ff24f7b5101101ff897dfdde3f37924e676bc2 ]
In addition, the 0day bot reported this build error:
Quoted 1 line
Quoted 1 line
drivers/ras/debugfs.c:10:5: error: redefinition of 'ras_userspace_consumers'
int ras_userspace_consumers(void)
^~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/ras/debugfs.c:3:0:
include/linux/ras.h:14:19: note: previous definition of 'ras_userspace_consumers' was here
static inline int ras_userspace_consumers(void) { return 0; }
^~~~~~~~~~~~~~~~~~~~~~~for a riscv-specific .config where CONFIG_DEBUG_FS is not set. Fix all that by making debugfs.o depend on that define.
[ bp: Rewrite commit message. ]
--- drivers/ras/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/ras/Makefile +2 -1
@@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only -obj-$(CONFIG_RAS) += ras.o debugfs.o +obj-$(CONFIG_RAS) += ras.o +obj-$(CONFIG_DEBUG_FS) += debugfs.o obj-$(CONFIG_RAS_CEC) += cec.o
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 93/344 ASoC: hdac_hda: fix page fault issue by removing race
In reply to Greg Kroah-HartmanFrom: Keyon Jie <[email protected]>
[ Upstream commit 804cbf4bb063204ca6c2471baa694548aab02ce3 ]
There is a race between hda codec device removing and the jack-detecting work, which will lead to a page fault issue as the latter work is accessing codec device which could be already removed.
Here add the cancellation of jack-detecting work before codecs are actually removed to avoid the race and fix the issue.
--- sound/soc/codecs/hdac_hda.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/soc/codecs/hdac_hda.c +4 -0
@@ -495,6 +495,10 @@ static int hdac_hda_dev_probe(struct hdac_device *hdev)static int hdac_hda_dev_remove (struct hdac_device *hdev) { +struct hdac_hda_priv *hda_pvt; + + hda_pvt =dev_get_drvdata (&hdev->dev); +cancel_delayed_work_sync (&hda_pvt->codec.jackpoll_work);return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 94/344 ACPI / processor: dont print errors for processorIDs == 0xff
In reply to Greg Kroah-HartmanFrom: Jiri Slaby <[email protected]>
[ Upstream commit 2c2b005f549544c13ef4cfb0e4842949066889bc ]
Some platforms define their processors in this manner:
Device (SCK0)
{
Name (_HID, "ACPI0004" /* Module Device */) // _HID: Hardware ID
Name (_UID, "CPUSCK0") // _UID: Unique ID
Processor (CP00, 0x00, 0x00000410, 0x06){}
Processor (CP01, 0x02, 0x00000410, 0x06){}
Processor (CP02, 0x04, 0x00000410, 0x06){}
Processor (CP03, 0x06, 0x00000410, 0x06){}
Processor (CP04, 0x01, 0x00000410, 0x06){}
Processor (CP05, 0x03, 0x00000410, 0x06){}
Processor (CP06, 0x05, 0x00000410, 0x06){}
Processor (CP07, 0x07, 0x00000410, 0x06){}
Processor (CP08, 0xFF, 0x00000410, 0x06){}
Processor (CP09, 0xFF, 0x00000410, 0x06){}
Processor (CP0A, 0xFF, 0x00000410, 0x06){}
Processor (CP0B, 0xFF, 0x00000410, 0x06){}...
The processors marked as 0xff are invalid, there are only 8 of them in this case.
So do not print an error on ids == 0xff, just print an info message. Actually, we could return ENODEV even on the first CPU with ID 0xff, but ACPI spec does not forbid the 0xff value to be a processor ID. Given 0xff could be a correct one, we would break working systems if we returned ENODEV.
--- drivers/acpi/acpi_processor.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/acpi/acpi_processor.c +7 -3
@@ -279,9 +279,13 @@ static int acpi_processor_get_info(struct acpi_device *device) }if (acpi_duplicate_processor_id (pr->acpi_id)) { -dev_err (&device->dev, -"Failed to get unique processor _UID (0x%x)\n" , - pr->acpi_id); +if (pr->acpi_id ==0xff ) +dev_info_once (&device->dev, +"Entry not well-defined, consider updating BIOS\n" ); +else +dev_err (&device->dev, +"Failed to get unique processor _UID (0x%x)\n" , + pr->acpi_id);return -ENODEV ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 95/344 loop: Add LOOP_SET_DIRECT_IO to compat ioctl
In reply to Greg Kroah-HartmanFrom: Alessio Balsini <[email protected]>
[ Upstream commit fdbe4eeeb1aac219b14f10c0ed31ae5d1123e9b8 ]
Enabling Direct I/O with loop devices helps reducing memory usage by avoiding double caching. 32 bit applications running on 64 bits systems are currently not able to request direct I/O because is missing from the lo_compat_ioctl.
This patch fixes the compatibility issue mentioned above by exporting LOOP_SET_DIRECT_IO as additional lo_compat_ioctl() entry. The input argument for this ioctl is a single long converted to a 1-bit boolean, so compatibility is preserved.
--- drivers/block/loop.c | 1 + 1 file changed, 1 insertion(+)
drivers/block/loop.c +1 -0
@@ -1755,6 +1755,7 @@ static int lo_compat_ioctl(struct block_device *bdev, fmode_t mode,case LOOP_SET_FD :case LOOP_CHANGE_FD :case LOOP_SET_BLOCK_SIZE : +case LOOP_SET_DIRECT_IO : err =lo_ioctl (bdev, mode, cmd, arg);break ;default :
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 96/344 perf tools: Fix paths in include statements
In reply to Greg Kroah-HartmanFrom: Luke Mujica <[email protected]>
[ Upstream commit 2b75863b0845764529e01014a5c90664d8044cbe ]
These paths point to the wrong location but still work because they get picked up by a -I flag that happens to direct to the correct file. Fix paths to lead to the actual file location without help from include flags.
--- tools/perf/arch/x86/util/kvm-stat.c | 4 ++-- tools/perf/arch/x86/util/tsc.c | 6 +++--- tools/perf/ui/helpline.c | 4 ++-- tools/perf/ui/util.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-)
tools/perf/arch/x86/util/kvm-stat.c +2 -2
@@ -1,7 +1,7 @@// SPDX-License-Identifier: GPL-2.0 #include <errno.h> -#include "../../util/kvm-stat.h" -#include "../../util/evsel.h" +#include "../../../util/kvm-stat.h" +#include "../../../util/evsel.h" #include <asm/svm.h> #include <asm/vmx.h> #include <asm/kvm.h>
tools/perf/arch/x86/util/tsc.c +3 -3
@@ -5,10 +5,10 @@#include <linux/stddef.h> #include <linux/perf_event.h> -#include "../../perf.h" +#include "../../../perf.h" #include <linux/types.h> -#include "../../util/debug.h" -#include "../../util/tsc.h" +#include "../../../util/debug.h" +#include "../../../util/tsc.h" int perf_read_tsc_conversion (const struct perf_event_mmap_page *pc,struct perf_tsc_conversion *tc)
tools/perf/ui/helpline.c +2 -2
@@ -3,10 +3,10 @@#include <stdlib.h> #include <string.h> -#include "../debug.h" +#include "../util/debug.h" #include "helpline.h" #include "ui.h" -#include "../util.h" +#include "../util/util.h" char ui_helpline__current[512 ];
tools/perf/ui/util.c +1 -1
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0 #include "util.h" -#include "../debug.h" +#include "../util/debug.h" /*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 97/344 EDAC, pnd2: Fix ioremap() size in dnv_rd_reg()
In reply to Greg Kroah-HartmanFrom: Stephen Douthit <[email protected]>
[ Upstream commit 29a3388bfcce7a6d087051376ea02bf8326a957b ]
Depending on how BIOS has marked the reserved region containing the 32KB MCHBAR you can get warnings like:
resource sanity check: requesting [mem 0xfed10000-0xfed1ffff], which spans more than reserved [mem 0xfed10000-0xfed17fff] caller dnv_rd_reg+0xc8/0x240 [pnd2_edac] mapping multiple BARs
Not all of the mmio regions used in dnv_rd_reg() are the same size. The MCHBAR window is 32KB and the sideband ports are 64KB. Pass the correct size to ioremap() depending on which resource we're reading from.
--- drivers/edac/pnd2_edac.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/edac/pnd2_edac.c +6 -1
@@ -260,11 +260,14 @@ static u64 get_sideband_reg_base_addr(void) } } +#define DNV_MCHBAR_SIZE 0x8000 +#define DNV_SB_PORT_SIZE 0x10000static int dnv_rd_reg (int port,int off,int op,void *data,size_t sz,char *name) {struct pci_dev *pdev;char *base;u64 addr; +unsigned long size;if (op ==4 ) { pdev =pci_get_device (PCI_VENDOR_ID_INTEL ,0x1980 ,NULL );
@@ -279,15 +282,17 @@ static int dnv_rd_reg(int port, int off, int op, void *data, size_t sz, char *na addr =get_mem_ctrl_hub_base_addr ();if (!addr)return -ENODEV ; + size =DNV_MCHBAR_SIZE ; }else {/* MMIO via sideband register base address */ addr =get_sideband_reg_base_addr ();if (!addr)return -ENODEV ; addr += (port <<16 ); + size =DNV_SB_PORT_SIZE ; } - base =ioremap ((resource_size_t )addr,0x10000 ); + base =ioremap ((resource_size_t )addr, size);if (!base)return -ENODEV ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 98/344 efi: cper: print AER info of PCIe fatal error
In reply to Greg Kroah-HartmanFrom: Xiaofei Tan <[email protected]>
[ Upstream commit b194a77fcc4001dc40aecdd15d249648e8a436d1 ]
AER info of PCIe fatal error is not printed in the current driver. Because APEI driver will panic directly for fatal error, and can't run to the place of printing AER info.
An example log is as following:
{763}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 11 {763}[Hardware Error]: event severity: fatal
{763}[Hardware Error]: Error 0, type: fatal
{763}[Hardware Error]: section_type: PCIe error
{763}[Hardware Error]: port_type: 0, PCIe end point
{763}[Hardware Error]: version: 4.0
{763}[Hardware Error]: command: 0x0000, status: 0x0010
{763}[Hardware Error]: device_id: 0000:82:00.0
{763}[Hardware Error]: slot: 0
{763}[Hardware Error]: secondary_bus: 0x00
{763}[Hardware Error]: vendor_id: 0x8086, device_id: 0x10fb
{763}[Hardware Error]: class_code: 000002
Kernel panic - not syncing: Fatal hardware error!This issue was imported by the patch, '37448adfc7ce ("aerdrv: Move cper_print_aer() call out of interrupt context")'. To fix this issue, this patch adds print of AER info in cper_print_pcie() for fatal error.
Here is the example log after this patch applied:
{24}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 10 {24}[Hardware Error]: event severity: fatal
{24}[Hardware Error]: Error 0, type: fatal
{24}[Hardware Error]: section_type: PCIe error
{24}[Hardware Error]: port_type: 0, PCIe end point
{24}[Hardware Error]: version: 4.0
{24}[Hardware Error]: command: 0x0546, status: 0x4010
{24}[Hardware Error]: device_id: 0000:01:00.0
{24}[Hardware Error]: slot: 0
{24}[Hardware Error]: secondary_bus: 0x00
{24}[Hardware Error]: vendor_id: 0x15b3, device_id: 0x1019
{24}[Hardware Error]: class_code: 000002
{24}[Hardware Error]: aer_uncor_status: 0x00040000, aer_uncor_mask: 0x00000000
{24}[Hardware Error]: aer_uncor_severity: 0x00062010
{24}[Hardware Error]: TLP Header: 000000c0 01010000 00000001 00000000
Kernel panic - not syncing: Fatal hardware error!--- drivers/firmware/efi/cper.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
drivers/firmware/efi/cper.c +15 -0
@@ -390,6 +390,21 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,printk ("%s""bridge: secondary_status: 0x%04x, control: 0x%04x\n" , pfx, pcie->bridge.secondary_status, pcie->bridge.control); + +/* Fatal errors call __ghes_panic() before AER handler prints this */ +if ((pcie->validation_bits &CPER_PCIE_VALID_AER_INFO ) && + (gdata->error_severity &CPER_SEV_FATAL )) { +struct aer_capability_regs *aer; + + aer = (struct aer_capability_regs *)pcie->aer_info; +printk ("%saer_uncor_status: 0x%08x, aer_uncor_mask: 0x%08x\n" , + pfx, aer->uncor_status, aer->uncor_mask); +printk ("%saer_uncor_severity: 0x%08x\n" , + pfx, aer->uncor_severity); +printk ("%sTLP Header: %08x %08x %08x %08x\n" , pfx, + aer->header_log.dw0, aer->header_log.dw1, + aer->header_log.dw2, aer->header_log.dw3); + } } static void cper_print_tstamp(const char *pfx,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 99/344 firmware: arm_scmi: Check if platform has released shmem before using
In reply to Greg Kroah-HartmanFrom: Sudeep Holla <[email protected]>
[ Upstream commit 9dc34d635c67e57051853855c43249408641a5ab ]
Sometimes platfom may take too long to respond to the command and OS might timeout before platform transfer the ownership of the shared memory region to the OS with the response.
Since the mailbox channel associated with the channel is freed and new commands are dispatch on the same channel, OS needs to wait until it gets back the ownership. If not, either OS may end up overwriting the platform response for the last command(which is fine as OS timed out that command) or platform might overwrite the payload for the next command with the response for the old.
The latter is problematic as platform may end up interpretting the response as the payload. In order to avoid such race, let's wait until the OS gets back the ownership before we prepare the shared memory with the payload for the next command.
--- drivers/firmware/arm_scmi/driver.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/firmware/arm_scmi/driver.c +8 -0
@@ -271,6 +271,14 @@ static void scmi_tx_prepare(struct mbox_client *cl, void *m)struct scmi_chan_info *cinfo =client_to_scmi_chan_info (cl);struct scmi_shared_mem __iomem *mem = cinfo->payload; +/* +* Ideally channel must be free by now unless OS timeout last +* request and platform continued to process the same, wait +* until it releases the shared memory, otherwise we may endup +* overwriting its response with new message payload or vice-versa +*/ +spin_until_cond (ioread32 (&mem->channel_status) & +SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE );/* Mark channel busy + clear error */ iowrite32 (0x0 , &mem->channel_status); iowrite32(t->hdr.poll_completion ? 0 : SCMI_SHMEM_FLAG_INTR_ENABLED,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 100/344 sched/fair: Use rq_lock/unlock in online_fair_sched_group
In reply to Greg Kroah-HartmanFrom: Phil Auld <[email protected]>
[ Upstream commit a46d14eca7b75fffe35603aa8b81df654353d80f ]
Enabling WARN_DOUBLE_CLOCK in /sys/kernel/debug/sched_features causes warning to fire in update_rq_clock. This seems to be caused by onlining a new fair sched group not using the rq lock wrappers.
[] rq->clock_update_flags & RQCF_UPDATED
[] WARNING: CPU: 5 PID: 54385 at kernel/sched/core.c:210 update_rq_clock+0xec/0x150
[] Call Trace:
[] online_fair_sched_group+0x53/0x100 [] cpu_cgroup_css_online+0x16/0x20 [] online_css+0x1c/0x60 [] cgroup_apply_control_enable+0x231/0x3b0 [] cgroup_mkdir+0x41b/0x530 [] kernfs_iop_mkdir+0x61/0xa0 [] vfs_mkdir+0x108/0x1a0 [] do_mkdirat+0x77/0xe0 [] do_syscall_64+0x55/0x1d0 [] entry_SYSCALL_64_after_hwframe+0x44/0xa9
Using the wrappers in online_fair_sched_group instead of the raw locking removes this warning.
[ tglx: Use rq_*lock_irq() ]
--- kernel/sched/fair.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/sched/fair.c +3 -3
@@ -10301,18 +10301,18 @@ int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)void online_fair_sched_group (struct task_group *tg) {struct sched_entity *se; +struct rq_flags rf;struct rq *rq;int i;for_each_possible_cpu (i) { rq =cpu_rq (i); se = tg->se[i]; - -raw_spin_lock_irq (&rq->lock); +rq_lock_irq (rq, &rf);update_rq_clock (rq);attach_entity_cfs_rq (se);sync_throttle (tg, i); -raw_spin_unlock_irq (&rq->lock); +rq_unlock_irq (rq, &rf); } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 101/344 idle: Prevent late-arriving interrupts from disrupting offline
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
[ Upstream commit e78a7614f3876ac649b3df608789cb6ef74d0480 ]
Scheduling-clock interrupts can arrive late in the CPU-offline process, after idle entry and the subsequent call to cpuhp_report_idle_dead(). Once execution passes the call to rcu_report_dead(), RCU is ignoring the CPU, which results in lockdep complaints when the interrupt handler uses RCU:
------------------------------------------------------------------------
=============================
WARNING: suspicious RCU usage
5.2.0-rc1+ #681 Not tainted
-----------------------------kernel/sched/fair.c:9542 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
RCU used illegally from offline CPU!rcu_scheduler_active = 2, debug_locks = 1
no locks held by swapper/5/0.
stack backtrace: CPU: 5 PID: 0 Comm: swapper/5 Not tainted 5.2.0-rc1+ #681 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS Bochs 01/01/2011 Call Trace: <IRQ> dump_stack+0x5e/0x8b trigger_load_balance+0xa8/0x390 ? tick_sched_do_timer+0x60/0x60 update_process_times+0x3b/0x50 tick_sched_handle+0x2f/0x40 tick_sched_timer+0x32/0x70 __hrtimer_run_queues+0xd3/0x3b0 hrtimer_interrupt+0x11d/0x270 ? sched_clock_local+0xc/0x74 smp_apic_timer_interrupt+0x79/0x200 apic_timer_interrupt+0xf/0x20 </IRQ> RIP: 0010:delay_tsc+0x22/0x50 Code: ff 0f 1f 80 00 00 00 00 65 44 8b 05 18 a7 11 48 0f ae e8 0f 31 48 89 d6 48 c1 e6 20 48 09 c6 eb 0e f3 90 65 8b 05 fe a6 11 48 <41> 39 c0 75 18 0f ae e8 0f 31 48 c1 e2 20 48 09 c2 48 89 d0 48 29 RSP: 0000:ffff8f92c0157ed0 EFLAGS: 00000212 ORIG_RAX: ffffffffffffff13 RAX: 0000000000000005 RBX: ffff8c861f356400 RCX: ffff8f92c0157e64 RDX: 000000321214c8cc RSI: 00000032120daa7f RDI: 0000000000260f15 RBP: 0000000000000005 R08: 0000000000000005 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000001 R12: 0000000000000000 R13: 0000000000000000 R14: ffff8c861ee18000 R15: ffff8c861ee18000 cpuhp_report_idle_dead+0x31/0x60 do_idle+0x1d5/0x200 ? _raw_spin_unlock_irqrestore+0x2d/0x40 cpu_startup_entry+0x14/0x20 start_secondary+0x151/0x170 secondary_startup_64+0xa4/0xb0
------------------------------------------------------------------------
This happens rarely, but can be forced by happen more often by placing delays in cpuhp_report_idle_dead() following the call to rcu_report_dead(). With this in place, the following rcutorture scenario reproduces the problem within a few minutes:
tools/testing/selftests/rcutorture/bin/kvm.sh --cpus 8 --duration 5 --kconfig "CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y" --configs "TREE04"
This commit uses the crude but effective expedient of moving the disabling of interrupts within the idle loop to precede the cpu_is_offline() check. It also invokes tick_nohz_idle_stop_tick() instead of tick_nohz_idle_stop_tick_protected() to shut off the scheduling-clock interrupt.
--- kernel/sched/idle.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/sched/idle.c +3 -2
@@ -241,13 +241,14 @@ static void do_idle(void)check_pgt_cache ();rmb (); +local_irq_disable (); +if (cpu_is_offline (cpu)) { -tick_nohz_idle_stop_tick_protected (); +tick_nohz_idle_stop_tick ();cpuhp_report_idle_dead ();arch_cpu_idle_dead (); } -local_irq_disable ();arch_cpu_idle_enter ();/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 102/344 blk-mq: Fix memory leak in blk_mq_init_allocated_queue error handling
In reply to Greg Kroah-HartmanFrom: zhengbin <[email protected]>
[ Upstream commit 73d9c8d4c0017e21e1ff519474ceb1450484dc9a ]
If blk_mq_init_allocated_queue->elevator_init_mq fails, need to release the previously requested resources.
--- block/blk-mq.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
block/blk-mq.c +6 -3
@@ -2841,6 +2841,8 @@ static unsigned int nr_hw_queues(struct blk_mq_tag_set *set)struct request_queue *blk_mq_init_allocated_queue (struct blk_mq_tag_set *set,struct request_queue *q) { +int ret = -ENOMEM ; +/* mark the queue as mq asap */ q->mq_ops = set->ops;
@@ -2902,17 +2904,18 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,blk_mq_map_swqueue (q);if (!(set->flags &BLK_MQ_F_NO_SCHED )) { -int ret; - ret =elevator_init_mq (q);if (ret) -return ERR_PTR (ret); + goto err_tag_set; }return q; +err_tag_set: +blk_mq_del_queue_tag_set (q); err_hctxs:kfree (q->queue_hw_ctx); + q->nr_hw_queues =0 ; err_sys_init:blk_mq_sysfs_deinit (q); err_poll:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 103/344 media: gspca: zero usb_buf on error
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
[ Upstream commit 4843a543fad3bf8221cf14e5d5f32d15cee89e84 ]
If reg_r() fails, then gspca_dev->usb_buf was left uninitialized, and some drivers used the contents of that buffer in logic.
This caused several syzbot errors:
https://syzkaller.appspot.com/bug?extid=397fd082ce5143e2f67d
https://syzkaller.appspot.com/bug?extid=1a35278dd0ebfb3a038a
https://syzkaller.appspot.com/bug?extid=06ddf1788cfd048c5e82
I analyzed the gspca drivers and zeroed the buffer where needed.
--- drivers/media/usb/gspca/konica.c | 5 +++++ drivers/media/usb/gspca/nw80x.c | 5 +++++ drivers/media/usb/gspca/ov519.c | 10 ++++++++++ drivers/media/usb/gspca/ov534.c | 5 +++++ drivers/media/usb/gspca/ov534_9.c | 1 + drivers/media/usb/gspca/se401.c | 5 +++++ drivers/media/usb/gspca/sn9c20x.c | 5 +++++ drivers/media/usb/gspca/sonixb.c | 5 +++++ drivers/media/usb/gspca/sonixj.c | 5 +++++ drivers/media/usb/gspca/spca1528.c | 5 +++++ drivers/media/usb/gspca/sq930x.c | 5 +++++ drivers/media/usb/gspca/sunplus.c | 5 +++++ drivers/media/usb/gspca/vc032x.c | 5 +++++ drivers/media/usb/gspca/w996Xcf.c | 5 +++++ 14 files changed, 71 insertions(+)
drivers/media/usb/gspca/konica.c +5 -0
@@ -114,6 +114,11 @@ static void reg_r(struct gspca_dev *gspca_dev, u16 value, u16 index)if (ret <0 ) {pr_err ("reg_r err %d\n" , ret); gspca_dev->usb_err = ret; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,2 ); } }
drivers/media/usb/gspca/nw80x.c +5 -0
@@ -1572,6 +1572,11 @@ static void reg_r(struct gspca_dev *gspca_dev,if (ret <0 ) {pr_err ("reg_r err %d\n" , ret); gspca_dev->usb_err = ret; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,USB_BUF_SZ );return ; }if (len ==1 )
drivers/media/usb/gspca/ov519.c +10 -0
@@ -2073,6 +2073,11 @@ static int reg_r(struct sd *sd, u16 index) }else {gspca_err (gspca_dev,"reg_r %02x failed %d\n" , index, ret); sd->gspca_dev.usb_err = ret; +/* +* Make sure the result is zeroed to avoid uninitialized +* values. +*/ + gspca_dev->usb_buf[0 ] =0 ; }return ret;
@@ -2101,6 +2106,11 @@ static int reg_r8(struct sd *sd, }else {gspca_err (gspca_dev,"reg_r8 %02x failed %d\n" , index, ret); sd->gspca_dev.usb_err = ret; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,8 ); }return ret;
drivers/media/usb/gspca/ov534.c +5 -0
@@ -693,6 +693,11 @@ static u8 ov534_reg_read(struct gspca_dev *gspca_dev, u16 reg)if (ret <0 ) {pr_err ("read failed %d\n" , ret); gspca_dev->usb_err = ret; +/* +* Make sure the result is zeroed to avoid uninitialized +* values. +*/ + gspca_dev->usb_buf[0 ] =0 ; }return gspca_dev->usb_buf[0 ]; }
drivers/media/usb/gspca/ov534_9.c +1 -0
@@ -1145,6 +1145,7 @@ static u8 reg_r(struct gspca_dev *gspca_dev, u16 reg)if (ret <0 ) {pr_err ("reg_r err %d\n" , ret); gspca_dev->usb_err = ret; +return 0 ; }return gspca_dev->usb_buf[0 ]; }
drivers/media/usb/gspca/se401.c +5 -0
@@ -101,6 +101,11 @@ static void se401_read_req(struct gspca_dev *gspca_dev, u16 req, int silent)pr_err ("read req failed req %#04x error %d\n" , req, err); gspca_dev->usb_err = err; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,READ_REQ_SIZE ); } }
drivers/media/usb/gspca/sn9c20x.c +5 -0
@@ -909,6 +909,11 @@ static void reg_r(struct gspca_dev *gspca_dev, u16 reg, u16 length)if (unlikely (result <0 || result != length)) {pr_err ("Read register %02x failed %d\n" , reg, result); gspca_dev->usb_err = result; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,USB_BUF_SZ ); } }
drivers/media/usb/gspca/sonixb.c +5 -0
@@ -453,6 +453,11 @@ static void reg_r(struct gspca_dev *gspca_dev,dev_err (gspca_dev->v4l2_dev.dev,"Error reading register %02x: %d\n" , value, res); gspca_dev->usb_err = res; +/* +* Make sure the result is zeroed to avoid uninitialized +* values. +*/ + gspca_dev->usb_buf[0 ] =0 ; } }
drivers/media/usb/gspca/sonixj.c +5 -0
@@ -1162,6 +1162,11 @@ static void reg_r(struct gspca_dev *gspca_dev,if (ret <0 ) {pr_err ("reg_r err %d\n" , ret); gspca_dev->usb_err = ret; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,USB_BUF_SZ ); } }
drivers/media/usb/gspca/spca1528.c +5 -0
@@ -71,6 +71,11 @@ static void reg_r(struct gspca_dev *gspca_dev,if (ret <0 ) {pr_err ("reg_r err %d\n" , ret); gspca_dev->usb_err = ret; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,USB_BUF_SZ ); } }
drivers/media/usb/gspca/sq930x.c +5 -0
@@ -425,6 +425,11 @@ static void reg_r(struct gspca_dev *gspca_dev,if (ret <0 ) {pr_err ("reg_r %04x failed %d\n" , value, ret); gspca_dev->usb_err = ret; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,USB_BUF_SZ ); } }
drivers/media/usb/gspca/sunplus.c +5 -0
@@ -255,6 +255,11 @@ static void reg_r(struct gspca_dev *gspca_dev,if (ret <0 ) {pr_err ("reg_r err %d\n" , ret); gspca_dev->usb_err = ret; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,USB_BUF_SZ ); } }
drivers/media/usb/gspca/vc032x.c +5 -0
@@ -2906,6 +2906,11 @@ static void reg_r_i(struct gspca_dev *gspca_dev,if (ret <0 ) {pr_err ("reg_r err %d\n" , ret); gspca_dev->usb_err = ret; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (gspca_dev->usb_buf,0 ,USB_BUF_SZ ); } } static void reg_r(struct gspca_dev *gspca_dev,
drivers/media/usb/gspca/w996Xcf.c +5 -0
@@ -133,6 +133,11 @@ static int w9968cf_read_sb(struct sd *sd) }else {pr_err ("Read SB reg [01] failed\n" ); sd->gspca_dev.usb_err = ret; +/* +* Make sure the buffer is zeroed to avoid uninitialized +* values. +*/ +memset (sd->gspca_dev.usb_buf,0 ,2 ); }udelay (W9968CF_I2C_BUS_DELAY );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 104/344 perf config: Honour $PERF_CONFIG env var to specify alternate .perfconfig
In reply to Greg Kroah-HartmanFrom: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit 61a461fcbd62d42c29a1ea6a9cc3838ad9f49401 ]
We had this comment in Documentation/perf_counter/config.c, i.e. since when we got this from the git sources, but never really did that getenv("PERF_CONFIG"), do it now as I need to disable whatever ~/.perfconfig root has so that tests parsing tool output are done for the expected default output or that we specify an alternate config file that when read will make the tools produce expected output.
--- tools/perf/perf.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/perf.c +3 -0
@@ -441,6 +441,9 @@ int main(int argc, const char **argv)srandom (time (NULL )); +/* Setting $PERF_CONFIG makes perf read _only_ the given config file. */ + config_exclusive_filename =getenv ("PERF_CONFIG" ); + err =perf_config (perf_default_config,NULL );if (err)return err;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 105/344 perf test vfs_getname: Disable ~/.perfconfig to get default output
In reply to Greg Kroah-HartmanFrom: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit 4fe94ce1c6ba678b5f12b94bb9996eea4fc99e85 ]
To get the expected output we have to ignore whatever changes the user has in its ~/.perfconfig file, so set PERF_CONFIG to /dev/null to achieve that.
Before:
# egrep 'trace|show_' ~/.perfconfig [trace] show_zeros = yes show_duration = no show_timestamp = no show_arg_names = no show_prefix = yes # echo $PERF_CONFIG
# perf test "trace + vfs_getname" 70: Check open filename arg using perf trace + vfs_getname: FAILED! # export PERF_CONFIG=/dev/null # perf test "trace + vfs_getname" 70: Check open filename arg using perf trace + vfs_getname: Ok #
After:
# egrep 'trace|show_' ~/.perfconfig [trace] show_zeros = yes show_duration = no show_timestamp = no show_arg_names = no show_prefix = yes # echo $PERF_CONFIG
# perf test "trace + vfs_getname" 70: Check open filename arg using perf trace + vfs_getname: Ok #
--- tools/perf/tests/shell/trace+probe_vfs_getname.sh | 4 ++++ 1 file changed, 4 insertions(+)
tools/perf/tests/shell/trace+probe_vfs_getname.sh +4 -0
@@ -32,6 +32,10 @@ if [ $err -ne 0 ] ; then exit $err fi +# Do not use whatever ~/.perfconfig file, it may change the output +# via trace.{show_timestamp,show_prefix,etc} +export PERF_CONFIG=/dev/null + trace_open_vfs_getname err=$? rm -f ${file}
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 106/344 media: mtk-mdp: fix reference count on old device tree
In reply to Greg Kroah-HartmanFrom: Matthias Brugger <[email protected]>
[ Upstream commit 864919ea0380e62adb2503b89825fe358acb8216 ]
of_get_next_child() increments the reference count of the returning device_node. Decrement it in the check if we are using the old or the new DTB.
--- drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/mtk-mdp/mtk_mdp_core.c +3 -1
@@ -110,7 +110,9 @@ static int mtk_mdp_probe(struct platform_device *pdev)mutex_init (&mdp->vpulock);/* Old dts had the components as child nodes */ -if (of_get_next_child (dev->of_node,NULL )) { + node =of_get_next_child (dev->of_node,NULL ); +if (node) { +of_node_put (node); parent = dev->of_node;dev_warn (dev,"device tree is out of date\n" ); }else {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 107/344 media: i2c: tda1997x: prevent potential NULL pointer access
In reply to Greg Kroah-HartmanFrom: Wolfram Sang <[email protected]>
[ Upstream commit 2f822f1da08ac5c93e351e79d22920f08fa51baf ]
i2c_new_dummy() can fail returning a NULL pointer. This is not checked and the returned pointer is blindly used. Convert to devm_i2c_new_dummy_client() which returns an ERR_PTR and also add a validity check. Using devm_* here also fixes a leak because the dummy client was not released in the probe error path.
--- drivers/media/i2c/tda1997x.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/media/i2c/tda1997x.c +7 -2
@@ -2691,7 +2691,13 @@ static int tda1997x_probe(struct i2c_client *client, } ret =0x34 + ((io_read (sd,REG_SLAVE_ADDR )>>4 ) &0x03 ); - state->client_cec =i2c_new_dummy (client->adapter, ret); + state->client_cec =devm_i2c_new_dummy_device (&client->dev, + client->adapter, ret); +if (IS_ERR (state->client_cec)) { + ret =PTR_ERR (state->client_cec); + goto err_free_mutex; + } +v4l_info (client,"CEC slave address 0x%02x\n" , ret); ret =tda1997x_core_init (sd);
@@ -2798,7 +2804,6 @@ static int tda1997x_remove(struct i2c_client *client)media_entity_cleanup (&sd->entity);v4l2_ctrl_handler_free (&state->hdl);regulator_bulk_disable (TDA1997X_NUM_SUPPLIES , state->supplies); -i2c_unregister_device (state->client_cec);cancel_delayed_work (&state->delayed_work_enable_hpd);mutex_destroy (&state->page_lock);mutex_destroy (&state->lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 108/344 media: fdp1: Reduce FCP not found message level to debug
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 4fd22938569c14f6092c05880ca387409d78355f ]
When support for the IPMMU is not enabled, the FDP driver may be probe-deferred multiple times, causing several messages to be printed like:
rcar_fdp1 fe940000.fdp1: FCP not found (-517)
rcar_fdp1 fe944000.fdp1: FCP not found (-517)Fix this by reducing the message level to debug level, as is done in the VSP1 driver.
--- drivers/media/platform/rcar_fdp1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/platform/rcar_fdp1.c +1 -1
@@ -2306,7 +2306,7 @@ static int fdp1_probe(struct platform_device *pdev) fdp1->fcp =rcar_fcp_get (fcp_node);of_node_put (fcp_node);if (IS_ERR (fdp1->fcp)) { -dev_err (&pdev->dev,"FCP not found (%ld)\n" , +dev_dbg (&pdev->dev,"FCP not found (%ld)\n" ,PTR_ERR (fdp1->fcp));return PTR_ERR (fdp1->fcp); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 109/344 media: em28xx: modules workqueue not inited for 2nd device
In reply to Greg Kroah-HartmanFrom: Sean Young <[email protected]>
[ Upstream commit 46e4a26615cc7854340e4b69ca59ee78d6f20c8b ]
syzbot reports an error on flush_request_modules() for the second device. This workqueue was never initialised so simply remove the offending line.
usb 1-1: USB disconnect, device number 2
em28xx 1-1:1.153: Disconnecting em28xx #1
------------[ cut here ]------------ WARNING: CPU: 0 PID: 12 at kernel/workqueue.c:3031 __flush_work.cold+0x2c/0x36 kernel/workqueue.c:3031 Kernel panic - not syncing: panic_on_warn set ... CPU: 0 PID: 12 Comm: kworker/0:1 Not tainted 5.3.0-rc2+ #25 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Workqueue: usb_hub_wq hub_event Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0xca/0x13e lib/dump_stack.c:113 panic+0x2a3/0x6da kernel/panic.c:219 __warn.cold+0x20/0x4a kernel/panic.c:576 report_bug+0x262/0x2a0 lib/bug.c:186 fixup_bug arch/x86/kernel/traps.c:179 [inline] fixup_bug arch/x86/kernel/traps.c:174 [inline] do_error_trap+0x12b/0x1e0 arch/x86/kernel/traps.c:272 do_invalid_op+0x32/0x40 arch/x86/kernel/traps.c:291 invalid_op+0x23/0x30 arch/x86/entry/entry_64.S:1026 RIP: 0010:__flush_work.cold+0x2c/0x36 kernel/workqueue.c:3031 Code: 9a 22 00 48 c7 c7 20 e4 c5 85 e8 d9 3a 0d 00 0f 0b 45 31 e4 e9 98 86
ff ff e8 51 9a 22 00 48 c7 c7 20 e4 c5 85 e8 be 3a 0d 00 <0f> 0b 45 31 e4 e9 7d 86 ff ff e8 36 9a 22 00 48 c7 c7 20 e4 c5 85
RSP: 0018:ffff8881da20f720 EFLAGS: 00010286
RAX: 0000000000000024 RBX: dffffc0000000000 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffffffff8128a0fd RDI: ffffed103b441ed6
RBP: ffff8881da20f888 R08: 0000000000000024 R09: fffffbfff11acd9a
R10: fffffbfff11acd99 R11: ffffffff88d66ccf R12: 0000000000000000
R13: 0000000000000001 R14: ffff8881c6685df8 R15: ffff8881d2a85b78
flush_request_modules drivers/media/usb/em28xx/em28xx-cards.c:3325 [inline] em28xx_usb_disconnect.cold+0x280/0x2a6 drivers/media/usb/em28xx/em28xx-cards.c:4023 usb_unbind_interface+0x1bd/0x8a0 drivers/usb/core/driver.c:423 __device_release_driver drivers/base/dd.c:1120 [inline] device_release_driver_internal+0x404/0x4c0 drivers/base/dd.c:1151 bus_remove_device+0x2dc/0x4a0 drivers/base/bus.c:556 device_del+0x420/0xb10 drivers/base/core.c:2288 usb_disable_device+0x211/0x690 drivers/usb/core/message.c:1237 usb_disconnect+0x284/0x8d0 drivers/usb/core/hub.c:2199 hub_port_connect drivers/usb/core/hub.c:4949 [inline] hub_port_connect_change drivers/usb/core/hub.c:5213 [inline] port_event drivers/usb/core/hub.c:5359 [inline] hub_event+0x1454/0x3640 drivers/usb/core/hub.c:5441 process_one_work+0x92b/0x1530 kernel/workqueue.c:2269 process_scheduled_works kernel/workqueue.c:2331 [inline] worker_thread+0x7ab/0xe20 kernel/workqueue.c:2417 kthread+0x318/0x420 kernel/kthread.c:255 ret_from_fork+0x24/0x30 arch/x86/entry/entry_64.S:352
Kernel Offset: disabled
Rebooting in 86400 seconds..
--- drivers/media/usb/em28xx/em28xx-cards.c | 1 - 1 file changed, 1 deletion(-)
drivers/media/usb/em28xx/em28xx-cards.c +0 -1
@@ -4020,7 +4020,6 @@ static void em28xx_usb_disconnect(struct usb_interface *intf) dev->dev_next->disconnected =1 ;dev_info (&dev->intf->dev,"Disconnecting %s\n" , dev->dev_next->name); -flush_request_modules (dev->dev_next); } dev->disconnected =1 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 110/344 arm64/efi: Move variable assignments after SECTIONS
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
[ Upstream commit 90776dd1c427cbb4d381aa4b13338f1fb1d20f5e ]
It seems that LLVM's linker does not correctly handle variable assignments involving section positions that are updated during the SECTIONS parsing. Commit aa69fb62bea1 ("arm64/efi: Mark __efistub_stext_offset as an absolute symbol explicitly") ran into this too, but found a different workaround.
However, this was not enough, as other variables were also miscalculated which manifested as boot failures under UEFI where __efistub__end was not taking the correct _end value (they should be the same):
$ ld.lld -EL -maarch64elf --no-undefined -X -shared \ -Bsymbolic -z notext -z norelro --no-apply-dynamic-relocs \ -o vmlinux.lld -T poc.lds --whole-archive vmlinux.o && \ readelf -Ws vmlinux.lld | egrep '\b(__efistub_|)_end\b' 368272: ffff000002218000 0 NOTYPE LOCAL HIDDEN 38 __efistub__end 368322: ffff000012318000 0 NOTYPE GLOBAL DEFAULT 38 _end
$ aarch64-linux-gnu-ld.bfd -EL -maarch64elf --no-undefined -X -shared \ -Bsymbolic -z notext -z norelro --no-apply-dynamic-relocs \ -o vmlinux.bfd -T poc.lds --whole-archive vmlinux.o && \ readelf -Ws vmlinux.bfd | egrep '\b(__efistub_|)_end\b' 338124: ffff000012318000 0 NOTYPE LOCAL DEFAULT ABS __efistub__end 383812: ffff000012318000 0 NOTYPE GLOBAL DEFAULT 15325 _end
To work around this, all of the __efistub_-prefixed variable assignments need to be moved after the linker script's SECTIONS entry. As it turns out, this also solves the problem fixed in commit aa69fb62bea1, so those changes are reverted here.
--- arch/arm64/kernel/image-vars.h | 51 +++++++++++++++++++++++++++++++++ arch/arm64/kernel/image.h | 42 --------------------------- arch/arm64/kernel/vmlinux.lds.S | 2 ++ 3 files changed, 53 insertions(+), 42 deletions(-) create mode 100644 arch/arm64/kernel/image-vars.h
arch/arm64/kernel/image-vars.h new file +51 -0
@@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +* Linker script variables to be set after section resolution, as +* ld.lld does not like variables assigned before SECTIONS is processed. +*/ +#ifndef __ARM64_KERNEL_IMAGE_VARS_H +#define __ARM64_KERNEL_IMAGE_VARS_H + +#ifndef LINKER_SCRIPT +#error This file should only be included in vmlinux.lds.S +#endif + +#ifdef CONFIG_EFI + +__efistub_stext_offset = stext - _text; + +/* +* The EFI stub has its own symbol namespace prefixed by __efistub_, to +* isolate it from the kernel proper. The following symbols are legally +* accessed by the stub, so provide some aliases to make them accessible. +* Only include data symbols here, or text symbols of functions that are +* guaranteed to be safe when executed at another offset than they were +* linked at. The routines below are all implemented in assembler in a +* position independent manner +*/ +__efistub_memcmp = __pi_memcmp; +__efistub_memchr = __pi_memchr; +__efistub_memcpy = __pi_memcpy; +__efistub_memmove = __pi_memmove; +__efistub_memset = __pi_memset; +__efistub_strlen = __pi_strlen; +__efistub_strnlen = __pi_strnlen; +__efistub_strcmp = __pi_strcmp; +__efistub_strncmp = __pi_strncmp; +__efistub_strrchr = __pi_strrchr; +__efistub___flush_dcache_area = __pi___flush_dcache_area; + +#ifdef CONFIG_KASAN +__efistub___memcpy = __pi_memcpy; +__efistub___memmove = __pi_memmove; +__efistub___memset = __pi_memset; +#endif + +__efistub__text = _text; +__efistub__end = _end; +__efistub__edata = _edata; +__efistub_screen_info = screen_info; + +#endif + +#endif /* __ARM64_KERNEL_IMAGE_VARS_H */
arch/arm64/kernel/image.h +0 -42
46 lines not on this page · raw message
arch/arm64/kernel/vmlinux.lds.S +2 -0
@@ -245,6 +245,8 @@ SECTIONS HEAD_SYMBOLS } +#include "image-vars.h" + /* * The HYP init code and ID map text can't be longer than a page each, * and should not cross a page boundary.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 111/344 perf unwind: Fix libunwind when tid != pid
In reply to Greg Kroah-HartmanFrom: John Keeping <[email protected]>
[ Upstream commit e8ba2906f6b9054102ad035ac9cafad9d4168589 ]
Commit e5adfc3e7e77 ("perf map: Synthesize maps only for thread group leader") changed the recording side so that we no longer get mmap events for threads other than the thread group leader (when synthesising these events for threads which exist before perf is started).
When a file recorded after this change is loaded, the lack of mmap records mean that unwinding is not set up for any other threads.
This can be seen in a simple record/report scenario:
perf record --call-graph=dwarf -t $TID perf report
If $TID is a process ID then the report will show call graphs, but if $TID is a secondary thread the output is as if --call-graph=none was specified.
Following the rationale in that commit, move the libunwind fields into struct map_groups and update the libunwind functions to take this instead of the struct thread. This is only required for unwind__finish_access which must now be called from map_groups__delete and the others are changed for symmetry.
Note that unwind__get_entries keeps the thread argument since it is required for symbol lookup and the libdw unwind provider uses the thread ID.
--- tools/perf/util/map.c | 3 ++- tools/perf/util/map_groups.h | 4 +++ tools/perf/util/thread.c | 7 +++-- tools/perf/util/thread.h | 4 --- tools/perf/util/unwind-libunwind-local.c | 18 ++++++------- tools/perf/util/unwind-libunwind.c | 34 ++++++++++++------------ tools/perf/util/unwind.h | 25 ++++++++--------- 7 files changed, 48 insertions(+), 47 deletions(-)
tools/perf/util/map.c +2 -1
@@ -647,6 +647,7 @@ struct map_groups *map_groups__new(struct machine *machine)void map_groups__delete (struct map_groups *mg) {map_groups__exit (mg); +unwind__finish_access (mg);free (mg); }
@@ -887,7 +888,7 @@ int map_groups__clone(struct thread *thread, struct map_groups *parent)if (new ==NULL ) goto out_unlock; - err =unwind__prepare_access (thread, new,NULL ); + err =unwind__prepare_access (mg, new,NULL );if (err) goto out_unlock;
tools/perf/util/map_groups.h +4 -0
@@ -31,6 +31,10 @@ struct map_groups {struct maps maps;struct machine *machine;refcount_t refcnt; +#ifdef HAVE_LIBUNWIND_SUPPORT +void *addr_space; +struct unwind_libunwind_ops *unwind_libunwind_ops; +#endif };#define KMAP_NAME_LEN 256
tools/perf/util/thread.c +3 -4
@@ -105,7 +105,6 @@ void thread__delete(struct thread *thread) }up_write (&thread->comm_lock); -unwind__finish_access (thread);nsinfo__zput (thread->nsinfo);srccode_state_free (&thread->srccode_state);
@@ -252,7 +251,7 @@ static int ____thread__set_comm(struct thread *thread, const char *str,list_add (&new->list, &thread->comm_list);if (exec) -unwind__flush_access (thread); +unwind__flush_access (thread->mg); } thread->comm_set = true;
@@ -332,7 +331,7 @@ int thread__insert_map(struct thread *thread, struct map *map) {int ret; - ret =unwind__prepare_access (thread, map,NULL ); + ret =unwind__prepare_access (thread->mg, map,NULL );if (ret)return ret;
@@ -352,7 +351,7 @@ static int __thread__prepare_access(struct thread *thread)down_read (&maps->lock);for (map =maps__first (maps); map; map =map__next (map)) { - err =unwind__prepare_access (thread, map, &initialized); + err =unwind__prepare_access (thread->mg, map, &initialized);if (err || initialized)break ; }
tools/perf/util/thread.h +0 -4
@@ -44,10 +44,6 @@ struct thread {struct thread_stack *ts;struct nsinfo *nsinfo;struct srccode_state srccode_state; -#ifdef HAVE_LIBUNWIND_SUPPORT -void *addr_space; -struct unwind_libunwind_ops *unwind_libunwind_ops; -#endif bool filter;int filter_entry_depth; };
tools/perf/util/unwind-libunwind-local.c +9 -9
@@ -616,26 +616,26 @@ static unw_accessors_t accessors = { .get_proc_name = get_proc_name, }; -static int _unwind__prepare_access (struct thread *thread) +static int _unwind__prepare_access (struct map_groups *mg) { - thread->addr_space =unw_create_addr_space (&accessors,0 ); -if (!thread->addr_space) { + mg->addr_space =unw_create_addr_space (&accessors,0 ); +if (!mg->addr_space) {pr_err ("unwind: Can't create unwind address space.\n" );return -ENOMEM ; } -unw_set_caching_policy (thread->addr_space,UNW_CACHE_GLOBAL ); +unw_set_caching_policy (mg->addr_space,UNW_CACHE_GLOBAL );return 0 ; } -static void _unwind__flush_access (struct thread *thread) +static void _unwind__flush_access (struct map_groups *mg) { -unw_flush_cache (thread->addr_space,0 ,0 ); +unw_flush_cache (mg->addr_space,0 ,0 ); } -static void _unwind__finish_access (struct thread *thread) +static void _unwind__finish_access (struct map_groups *mg) { -unw_destroy_addr_space (thread->addr_space); +unw_destroy_addr_space (mg->addr_space); } static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
@@ -660,7 +660,7 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,*/ if (max_stack -1 >0 ) {WARN_ONCE (!ui->thread,"WARNING: ui->thread is NULL" ); - addr_space = ui->thread->addr_space; + addr_space = ui->thread->mg->addr_space;if (addr_space ==NULL )return -1 ;
tools/perf/util/unwind-libunwind.c +17 -17
@@ -11,13 +11,13 @@ struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops;struct unwind_libunwind_ops __weak *x86_32_unwind_libunwind_ops;struct unwind_libunwind_ops __weak *arm64_unwind_libunwind_ops; -static void unwind__register_ops (struct thread *thread, +static void unwind__register_ops (struct map_groups *mg,struct unwind_libunwind_ops *ops) { - thread->unwind_libunwind_ops = ops; + mg->unwind_libunwind_ops = ops; } -int unwind__prepare_access (struct thread *thread,struct map *map, +int unwind__prepare_access (struct map_groups *mg,struct map *map,bool *initialized) {const char *arch;
@@ -28,7 +28,7 @@ int unwind__prepare_access(struct thread *thread, struct map *map,if (!dwarf_callchain_users)return 0 ; -if (thread->addr_space) { +if (mg->addr_space) {pr_debug ("unwind: thread map already set, dso=%s\n" , map->dso->name);if (initialized)
@@ -37,14 +37,14 @@ int unwind__prepare_access(struct thread *thread, struct map *map, }/* env->arch is NULL for live-mode (i.e. perf top) */ -if (!thread->mg->machine->env || !thread->mg->machine->env->arch) +if (!mg->machine->env || !mg->machine->env->arch) goto out_register; - dso_type =dso__type (map->dso, thread->mg->machine); + dso_type =dso__type (map->dso, mg->machine);if (dso_type ==DSO__TYPE_UNKNOWN )return 0 ; - arch =perf_env__arch (thread->mg->machine->env); + arch =perf_env__arch (mg->machine->env);if (!strcmp (arch,"x86" )) {if (dso_type !=DSO__TYPE_64BIT )
@@ -59,37 +59,37 @@ int unwind__prepare_access(struct thread *thread, struct map *map,return 0 ; } out_register: -unwind__register_ops (thread, ops); +unwind__register_ops (mg, ops); - err = thread->unwind_libunwind_ops->prepare_access (thread); + err = mg->unwind_libunwind_ops->prepare_access (mg);if (initialized) *initialized = err ? false : true;return err; } -void unwind__flush_access (struct thread *thread) +void unwind__flush_access (struct map_groups *mg) {if (!dwarf_callchain_users)return ; -if (thread->unwind_libunwind_ops) - thread->unwind_libunwind_ops->flush_access (thread); +if (mg->unwind_libunwind_ops) + mg->unwind_libunwind_ops->flush_access (mg); } -void unwind__finish_access (struct thread *thread) +void unwind__finish_access (struct map_groups *mg) {if (!dwarf_callchain_users)return ; -if (thread->unwind_libunwind_ops) - thread->unwind_libunwind_ops->finish_access (thread); +if (mg->unwind_libunwind_ops) + mg->unwind_libunwind_ops->finish_access (mg); }int unwind__get_entries (unwind_entry_cb_t cb,void *arg,struct thread *thread,struct perf_sample *data,int max_stack) { -if (thread->unwind_libunwind_ops) -return thread->unwind_libunwind_ops->get_entries (cb, arg, thread, data, max_stack); +if (thread->mg->unwind_libunwind_ops) +return thread->mg->unwind_libunwind_ops->get_entries (cb, arg, thread, data, max_stack);return 0 ; }
tools/perf/util/unwind.h +13 -12
@@ -6,6 +6,7 @@#include <linux/types.h> struct map ; +struct map_groups ;struct perf_sample ;struct symbol ;struct thread ;
@@ -19,9 +20,9 @@ struct unwind_entry {typedef int (*unwind_entry_cb_t )(struct unwind_entry *entry,void *arg);struct unwind_libunwind_ops { -int (*prepare_access)(struct thread *thread); -void (*flush_access)(struct thread *thread); -void (*finish_access)(struct thread *thread); +int (*prepare_access)(struct map_groups *mg); +void (*flush_access)(struct map_groups *mg); +void (*finish_access)(struct map_groups *mg);int (*get_entries)(unwind_entry_cb_t cb,void *arg,struct thread *thread,struct perf_sample *data,int max_stack);
@@ -46,20 +47,20 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,#endif int LIBUNWIND__ARCH_REG_ID (int regnum); -int unwind__prepare_access (struct thread *thread,struct map *map, +int unwind__prepare_access (struct map_groups *mg,struct map *map,bool *initialized); -void unwind__flush_access (struct thread *thread); -void unwind__finish_access (struct thread *thread); +void unwind__flush_access (struct map_groups *mg); +void unwind__finish_access (struct map_groups *mg);#else -static inline int unwind__prepare_access (struct thread *thread__maybe_unused , +static inline int unwind__prepare_access (struct map_groups *mg__maybe_unused ,struct map *map__maybe_unused ,bool *initialized__maybe_unused ) {return 0 ; } -static inline void unwind__flush_access (struct thread *thread__maybe_unused ) {} -static inline void unwind__finish_access (struct thread *thread__maybe_unused ) {} +static inline void unwind__flush_access (struct map_groups *mg__maybe_unused ) {} +static inline void unwind__finish_access (struct map_groups *mg__maybe_unused ) {}#endif #else static inline int
@@ -72,14 +73,14 @@ unwind__get_entries(unwind_entry_cb_t cb __maybe_unused,return 0 ; } -static inline int unwind__prepare_access (struct thread *thread__maybe_unused , +static inline int unwind__prepare_access (struct map_groups *mg__maybe_unused ,struct map *map__maybe_unused ,bool *initialized__maybe_unused ) {return 0 ; } -static inline void unwind__flush_access (struct thread *thread__maybe_unused ) {} -static inline void unwind__finish_access (struct thread *thread__maybe_unused ) {} +static inline void unwind__flush_access (struct map_groups *mg__maybe_unused ) {} +static inline void unwind__finish_access (struct map_groups *mg__maybe_unused ) {}#endif /* HAVE_DWARF_UNWIND_SUPPORT */ #endif /* __UNWIND_H */
Signature · 1 line
2.20.1
Re: [PATCH 5.3 111/344] perf unwind: Fix libunwind when tid != pid
Hi,
Quoted 31 lines · Greg Kroah-Hartman
From: John Keeping <[email protected]>
[ Upstream commit
e8ba2906f6b9054102ad035ac9cafad9d4168589]Commit
e5adfc3e7e77("perf map: Synthesize maps only for thread group leader") changed the recording side so that we no longer get mmap events for threads other than the thread group leader (when synthesising these events for threads which exist before perf is started).When a file recorded after this change is loaded, the lack of mmap records mean that unwinding is not set up for any other threads.
This can be seen in a simple record/report scenario:
perf record --call-graph=dwarf -t $TID perf reportIf $TID is a process ID then the report will show call graphs, but if $TID is a secondary thread the output is as if --call-graph=none was specified.
Following the rationale in that commit, move the libunwind fields into struct
map_groupsand update the libunwind functions to take this instead of the struct thread. This is only required forunwind__finish_accesswhich must now be called frommap_groups__deleteand the others are changed for symmetry.Note that
unwind__get_entrieskeeps the thread argument since it is required for symbol lookup and the libdw unwind provider uses the thread ID.
Quoted 10 lines
Signed-off-by John Keeping <[email protected]>Reviewed-by Jiri Olsa <[email protected]>Cc Alexander Shishkin <[email protected]>Cc Konstantin Khlebnikov <[email protected]>Cc Namhyung Kim <[email protected]>Cc Peter Zijlstra <[email protected]>Fixes e5adfc3e7e77 ("perf map: Synthesize maps only for thread group leader")Signed-off-by Arnaldo Carvalho de Melo <[email protected]>Signed-off-by Sasha Levin <[email protected]>
This unfortunately broke --call-graph dwarf on 5.3 (and presumably older branches), because while this commit has been included in stable, the prerequisite
commit ab6cd0e5276e24403751e0b3b8ed807738a8571f
Author: John Keeping <[email protected]> AuthorDate: 2019-08-15 11:01:44 +0100 Commit: Arnaldo Carvalho de Melo <[email protected]> CommitDate: 2019-08-16 12:25:23 -0300
perf map: Use zalloc for map_groups
In the next commit we will add new fields to map_groups and we need these to be null if no value is assigned. The simplest way to achieve this is to request zeroed memory from the allocator.
has not.
The crash I get is:
Thread 1 "perf" received signal SIGSEGV, Segmentation fault. 0x0000555555872238 in unwind__flush_access (mg=0x555555c53b50) at util/unwind-libunwind.c:76
76 mg->unwind_libunwind_ops->flush_access(mg);
(gdb) bt
#0 0x0000555555872238 in unwind__flush_access (mg=0x555555c53b50) at util/unwind-libunwind.c:76
#1 0x0000555555800ac4 in ____thread__set_comm (exec=true, timestamp=325096707055731, str=0x7ffff7f96ed8 "sleep", thread=0x555555c53bc0) at util/thread.c:254
#2 __thread__set_comm (thread=thread@entry=0x555555c53bc0, str=str@entry=0x7ffff7f96ed8 "sleep", timestamp=325096707055731, exec=exec@entry=true)
at util/thread.c:268
#3 0x00005555557f132a in machine__process_comm_event (machine=0x555555c4bc68, event=0x7ffff7f96ec8, sample=0x7fffffff8f70) at util/machine.c:600
#4 0x00005555557fa93b in perf_session__deliver_event (session=0x555555c4baf0, event=0x7ffff7f96ec8, tool=0x555555acb9a0 <record>, file_offset=73416)
at util/session.c:1473
#5 0x00005555557feae8 in do_flush (show_progress=true, oe=0x555555c52610) at util/ordered-events.c:243
#6 __ordered_events__flush (oe=oe@entry=0x555555c52610, how=how@entry=OE_FLUSH__FINAL, timestamp=timestamp@entry=0) at util/ordered-events.c:322
#7 0x00005555557fef45 in __ordered_events__flush (timestamp=<optimized out>, how=<optimized out>, oe=<optimized out>) at util/ordered-events.c:338
#8 ordered_events__flush (how=OE_FLUSH__FINAL, oe=0x555555c52610) at util/ordered-events.c:340
#9 ordered_events__flush (oe=oe@entry=0x555555c52610, how=how@entry=OE_FLUSH__FINAL) at util/ordered-events.c:338#10 0x00005555557fd17c in __perf_session__process_events (session=0x555555c4baf0) at util/session.c:2152 #11 perf_session__process_events (session=session@entry=0x555555c4baf0) at util/session.c:2181
#12 0x0000555555729379 in process_buildids (rec=0x555555acb9a0 <record>) at builtin-record.c:829
#13 record__finish_output (rec=0x555555acb9a0 <record>) at builtin-record.c:1037
#14 0x000055555572c000 in __cmd_record (rec=0x555555acb9a0 <record>, argv=<optimized out>, argc=2) at builtin-record.c:1661 #15 cmd_record (argc=2, argv=<optimized out>) at builtin-record.c:2450
#16 0x000055555579cd9d in run_builtin (p=0x555555ad4958 <commands+216>, argc=5, argv=0x7fffffffdcc0) at perf.c:304 #17 0x0000555555714baa in handle_internal_command (argv=0x7fffffffdcc0, argc=5) at perf.c:356
#18 run_argv (argcp=<synthetic pointer>, argv=<synthetic pointer>) at perf.c:400
#19 main (argc=5, argv=0x7fffffffdcc0) at perf.c:525
(gdb) p *mg
$7 = {maps = {entries = {rb_node = 0x0}, names = {rb_node = 0x0}, lock = {lock = pthread_rwlock_t = {Status = Not acquired, Shared = No,
Prefers = Readers}}}, machine = 0x555555c4bc68, refcnt = {refs = {counter = 1}}, addr_space = 0x693f6967632e6775, unwind_libunwind_ops = 0xa32313438313d64}
(gdb) p mg->unwind_libunwind_ops
$8 = (struct unwind_libunwind_ops *) 0xa32313438313d64
(gdb) p *mg->unwind_libunwind_ops
Cannot access memory at address 0xa32313438313d64
which makes sense, because map_groups__new() allocates the group with malloc, and map_groups__init() only initializes map_groups->{maps,machine,refcnt}
A bit surprised that nobody complained about this so far...
Greetings,
Andres Freund
Greg Kroah-Hartman
maintainerRe: [PATCH 5.3 111/344] perf unwind: Fix libunwind when tid != pid
Quoted 111 lines · Andres Freund
Hi,
Quoted 31 lines · Greg Kroah-Hartman
From: John Keeping <[email protected]>
[ Upstream commit
e8ba2906f6b9054102ad035ac9cafad9d4168589]Commit
e5adfc3e7e77("perf map: Synthesize maps only for thread group leader") changed the recording side so that we no longer get mmap events for threads other than the thread group leader (when synthesising these events for threads which exist before perf is started).When a file recorded after this change is loaded, the lack of mmap records mean that unwinding is not set up for any other threads.
This can be seen in a simple record/report scenario:
perf record --call-graph=dwarf -t $TID perf reportIf $TID is a process ID then the report will show call graphs, but if $TID is a secondary thread the output is as if --call-graph=none was specified.
Following the rationale in that commit, move the libunwind fields into struct
map_groupsand update the libunwind functions to take this instead of the struct thread. This is only required forunwind__finish_accesswhich must now be called frommap_groups__deleteand the others are changed for symmetry.Note that
unwind__get_entrieskeeps the thread argument since it is required for symbol lookup and the libdw unwind provider uses the thread ID.Quoted 10 lines
Signed-off-by John Keeping <[email protected]>Reviewed-by Jiri Olsa <[email protected]>Cc Alexander Shishkin <[email protected]>Cc Konstantin Khlebnikov <[email protected]>Cc Namhyung Kim <[email protected]>Cc Peter Zijlstra <[email protected]>Fixes e5adfc3e7e77 ("perf map: Synthesize maps only for thread group leader")Signed-off-by Arnaldo Carvalho de Melo <[email protected]>Signed-off-by Sasha Levin <[email protected]>This unfortunately broke --call-graph dwarf on 5.3 (and presumably older branches), because while this commit has been included in stable, the prerequisite
commit
ab6cd0e5276e24403751e0b3b8ed807738a8571fAuthor: John Keeping <[email protected]> AuthorDate: 2019-08-15 11:01:44 +0100 Commit: Arnaldo Carvalho de Melo <[email protected]> CommitDate: 2019-08-16 12:25:23 -0300perf map: Use zalloc for
map_groupsIn the next commit we will add new fields to
map_groupsand we need these to be null if no value is assigned. The simplest way to achieve this is to request zeroed memory from the allocator.Signed-off-by John Keeping <[email protected]>Reviewed-by Jiri Olsa <[email protected]>Cc Alexander Shishkin <[email protected]>Cc Konstantin Khlebnikov <[email protected]>Cc Namhyung Kim <[email protected]>Cc Peter Zijlstra <[email protected]>Cc john keeping <[email protected]>Signed-off-by Arnaldo Carvalho de Melo <[email protected]>has not.
The crash I get is:
Thread 1 "perf" received signal SIGSEGV, Segmentation fault.
0x0000555555872238inunwind__flush_access(mg=0x555555c53b50) atutil/unwind-libunwind.c:76
76mg->unwind_libunwind_ops->flush_access(mg);
(gdb) bt#0 0x0000555555872238 in unwind__flush_access (mg=0x555555c53b50) at util/unwind-libunwind.c:76 #1 0x0000555555800ac4 in ____thread__set_comm (exec=true, timestamp=325096707055731, str=0x7ffff7f96ed8 "sleep", thread=0x555555c53bc0) at util/thread.c:254 #2 __thread__set_comm (thread=thread@entry=0x555555c53bc0, str=str@entry=0x7ffff7f96ed8 "sleep", timestamp=325096707055731, exec=exec@entry=true) at util/thread.c:268 #3 0x00005555557f132a in machine__process_comm_event (machine=0x555555c4bc68, event=0x7ffff7f96ec8, sample=0x7fffffff8f70) at util/machine.c:600 #4 0x00005555557fa93b in perf_session__deliver_event (session=0x555555c4baf0, event=0x7ffff7f96ec8, tool=0x555555acb9a0 <record>, file_offset=73416) at util/session.c:1473 #5 0x00005555557feae8 in do_flush (show_progress=true, oe=0x555555c52610) at util/ordered-events.c:243 #6 __ordered_events__flush (oe=oe@entry=0x555555c52610, how=how@entry=OE_FLUSH__FINAL, timestamp=timestamp@entry=0) at util/ordered-events.c:322 #7 0x00005555557fef45 in __ordered_events__flush (timestamp=<optimized out>, how=<optimized out>, oe=<optimized out>) at util/ordered-events.c:338 #8 ordered_events__flush (how=OE_FLUSH__FINAL, oe=0x555555c52610) at util/ordered-events.c:340 #9 ordered_events__flush (oe=oe@entry=0x555555c52610, how=how@entry=OE_FLUSH__FINAL) at util/ordered-events.c:338#10
0x00005555557fd17cin__perf_session__process_events(session=0x555555c4baf0) atutil/session.c:2152#11perf_session__process_events(session=session@entry=0x555555c4baf0) atutil/session.c:2181
#120x0000555555729379inprocess_buildids(rec=0x555555acb9a0 <record>) at builtin-record.c:829
#13record__finish_output(rec=0x555555acb9a0 <record>) at builtin-record.c:1037
#140x000055555572c000in__cmd_record(rec=0x555555acb9a0 <record>, argv=<optimized out>, argc=2) at builtin-record.c:1661 #15cmd_record(argc=2, argv=<optimized out>) at builtin-record.c:2450
#160x000055555579cd9dinrun_builtin(p=0x555555ad4958 <commands+216>, argc=5, argv=0x7fffffffdcc0) at perf.c:304 #170x0000555555714baainhandle_internal_command(argv=0x7fffffffdcc0, argc=5) at perf.c:356
#18run_argv(argcp=<synthetic pointer>, argv=<synthetic pointer>) at perf.c:400
#19 main (argc=5, argv=0x7fffffffdcc0) at perf.c:525(gdb) p *mg
$7 = {maps = {entries = {rb_node=0x0}, names = {rb_node=0x0}, lock = {lock =pthread_rwlock_t= {Status = Not acquired, Shared = No,Prefers = Readers}}}, machine = 0x555555c4bc68, refcnt = {refs = {counter = 1}}, addr_space = 0x693f6967632e6775,
unwind_libunwind_ops=0xa32313438313d64}(gdb) p
mg->unwind_libunwind_ops
$8 = (structunwind_libunwind_ops*)0xa32313438313d64
Quoted 8 lines
(gdb) p
*mg->unwind_libunwind_ops
Cannot access memory at address0xa32313438313d64which makes sense, because
map_groups__new()allocates the group with malloc, andmap_groups__init()only initializes map_groups->{maps,machine,refcnt}A bit surprised that nobody complained about this so far...
Thanks, I've queued up the other patch for 5.3.y now.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 112/344 media: rc: imon: Allow iMON RC protocol for ffdc 7e device
In reply to Greg Kroah-HartmanFrom: Darius Rad <[email protected]>
[ Upstream commit b20a6e298bcb8cb8ae18de26baaf462a6418515b ]
Allow selecting the IR protocol, MCE or iMON, for a device that identifies as follows (with config id 0x7e):
15c2:ffdc SoundGraph Inc. iMON PAD Remote Controller
As the driver is structured to default to iMON when both RC protocols are supported, existing users of this device (using MCE protocol) will need to manually switch to MCE (RC-6) protocol from userspace (with ir-keytable, sysfs).
--- drivers/media/rc/imon.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/media/rc/imon.c +6 -1
@@ -1826,12 +1826,17 @@ static void imon_get_ffdc_type(struct imon_context *ictx)break ;/* iMON VFD, MCE IR */ case 0x46 : -case 0x7e :case 0x9e :dev_info (ictx->dev,"0xffdc iMON VFD, MCE IR" ); detected_display_type =IMON_DISPLAY_TYPE_VFD ; allowed_protos =RC_PROTO_BIT_RC6_MCE ;break ; +/* iMON VFD, iMON or MCE IR */ +case 0x7e : +dev_info (ictx->dev,"0xffdc iMON VFD, iMON or MCE IR" ); + detected_display_type =IMON_DISPLAY_TYPE_VFD ; + allowed_protos |=RC_PROTO_BIT_RC6_MCE ; +break ;/* iMON LCD, MCE IR */ case 0x9f :dev_info (ictx->dev,"0xffdc iMON LCD, MCE IR" );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 113/344 dmaengine: iop-adma: use correct printk format strings
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 00c9755524fbaa28117be774d7c92fddb5ca02f3 ]
When compile-testing on other architectures, we get lots of warnings about incorrect format strings, like:
drivers/dma/iop-adma.c: In function 'iop_adma_alloc_slots':
drivers/dma/iop-adma.c:307:6: warning: format '%x' expects argument of type 'unsigned int', but argument 6 has type 'dma_addr_t {aka long long unsigned int}' [-Wformat=]
drivers/dma/iop-adma.c: In function 'iop_adma_prep_dma_memcpy':
Quoted 1 line
Quoted 1 line
drivers/dma/iop-adma.c:518:40: warning: format '%u' expects argument of type 'unsigned int', but argument 5 has type 'size_t{aka long unsigned int}' [-Wformat=]
Use %zu for printing size_t as required, and cast the dma_addr_t arguments to 'u64' for printing with %llx. Ideally this should use the %pad format string, but that requires an lvalue argument that doesn't work here.
--- drivers/dma/iop-adma.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/dma/iop-adma.c +9 -9
@@ -116,9 +116,9 @@ static void __iop_adma_slot_cleanup(struct iop_adma_chan *iop_chan)list_for_each_entry_safe (iter, _iter, &iop_chan->chain, chain_node) {pr_debug ("\tcookie: %d slot: %d busy: %d " -"this_desc: %#x next_desc: %#x ack: %d\n" , +"this_desc: %#x next_desc: %#llx ack: %d\n" , iter->async_tx.cookie, iter->idx, busy, - iter->async_tx.phys,iop_desc_get_next_desc (iter), + iter->async_tx.phys, (u64 )iop_desc_get_next_desc (iter),async_tx_test_ack (&iter->async_tx));prefetch (_iter);prefetch (&_iter->async_tx);
@@ -306,9 +306,9 @@ iop_adma_alloc_slots(struct iop_adma_chan *iop_chan, int num_slots,int i;dev_dbg (iop_chan->device->common.dev,"allocated slot: %d " -"(desc %p phys: %#x) slots_per_op %d\n" , +"(desc %p phys: %#llx) slots_per_op %d\n" , iter->idx, iter->hw_desc, - iter->async_tx.phys, slots_per_op); + (u64 )iter->async_tx.phys, slots_per_op);/* pre-ack all but the last descriptor */ if (num_slots != slots_per_op)
@@ -516,7 +516,7 @@ iop_adma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dma_dest,return NULL ;BUG_ON (len >IOP_ADMA_MAX_BYTE_COUNT ); -dev_dbg (iop_chan->device->common.dev,"%s len: %u\n" , +dev_dbg (iop_chan->device->common.dev,"%s len: %zu\n" , __func__, len);spin_lock_bh (&iop_chan->lock);
@@ -549,7 +549,7 @@ iop_adma_prep_dma_xor(struct dma_chan *chan, dma_addr_t dma_dest,BUG_ON (len >IOP_ADMA_XOR_MAX_BYTE_COUNT );dev_dbg (iop_chan->device->common.dev, -"%s src_cnt: %d len: %u flags: %lx\n" , +"%s src_cnt: %d len: %zu flags: %lx\n" , __func__, src_cnt, len, flags);spin_lock_bh (&iop_chan->lock);
@@ -582,7 +582,7 @@ iop_adma_prep_dma_xor_val(struct dma_chan *chan, dma_addr_t *dma_src,if (unlikely (!len))return NULL ; -dev_dbg (iop_chan->device->common.dev,"%s src_cnt: %d len: %u\n" , +dev_dbg (iop_chan->device->common.dev,"%s src_cnt: %d len: %zu\n" , __func__, src_cnt, len);spin_lock_bh (&iop_chan->lock);
@@ -620,7 +620,7 @@ iop_adma_prep_dma_pq(struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src,BUG_ON (len >IOP_ADMA_XOR_MAX_BYTE_COUNT );dev_dbg (iop_chan->device->common.dev, -"%s src_cnt: %d len: %u flags: %lx\n" , +"%s src_cnt: %d len: %zu flags: %lx\n" , __func__, src_cnt, len, flags);if (dmaf_p_disabled_continue (flags))
@@ -683,7 +683,7 @@ iop_adma_prep_dma_pq_val(struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src,return NULL ;BUG_ON (len >IOP_ADMA_XOR_MAX_BYTE_COUNT ); -dev_dbg (iop_chan->device->common.dev,"%s src_cnt: %d len: %u\n" , +dev_dbg (iop_chan->device->common.dev,"%s src_cnt: %d len: %zu\n" , __func__, src_cnt, len);spin_lock_bh (&iop_chan->lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 114/344 ARM: xscale: fix multi-cpu compilation
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit c7b68049943079550d4e6af0f10aa3aabd64131a ]
Building a combined ARMv4+XScale kernel produces these and other build failures:
/tmp/copypage-xscale-3aa821.s: Assembler messages:/tmp/copypage-xscale-3aa821.s:167: Error: selected processor does not support pld [r7,#0]' in ARM mode /tmp/copypage-xscale-3aa821.s:168: Error: selected processor does not support pld [r7,#32]' in ARM mode /tmp/copypage-xscale-3aa821.s:169: Error: selected processor does not support pld [r1,#0]' in ARM mode /tmp/copypage-xscale-3aa821.s:170: Error: selected processor does not support pld [r1,#32]' in ARM mode /tmp/copypage-xscale-3aa821.s:171: Error: selected processor does not support pld [r7,#64]' in ARM mode /tmp/copypage-xscale-3aa821.s:176: Error: selected processor does not support ldrd r4,r5,[r7],#8' in ARM mode /tmp/copypage-xscale-3aa821.s:180: Error: selected processor does not support `strd r4,r5,[r1],#8' in ARM mode
Add an explict .arch armv5 in the inline assembly to allow the ARMv5 specific instructions regardless of the compiler -march= target.
--- arch/arm/mm/copypage-xscale.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/arm/mm/copypage-xscale.c +4 -2
@@ -42,6 +42,7 @@ static void mc_copy_user_page(void *from, void *to)* when prefetching destination as well. (NP) */ asm volatile ("\ +.arch xscale \n\ pld [%0, #0] \n\ pld [%0, #32] \n\ pld [%1, #0] \n\
@@ -106,8 +107,9 @@ void xscale_mc_clear_user_highpage(struct page *page, unsigned long vaddr) { void *ptr, *kaddr = kmap_atomic(page); - asm volatile( - "mov r1, %2 \n\ + asm volatile("\ +.arch xscale \n\ + mov r1, %2 \n\ mov r2, #0 \n\ mov r3, #0 \n\ 1: mov ip, %0 \n\
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 115/344 perf record: Support aarch64 random socket_id assignment
In reply to Greg Kroah-HartmanFrom: Tan Xiaojun <[email protected]>
[ Upstream commit 0a4d8fb229dd78f9e0752817339e19e903b37a60 ]
Same as in the commit 01766229533f ("perf record: Support s390 random socket_id assignment"), aarch64 also have this problem.
Without this fix:
[root@localhost perf]# ./perf report --header -I -v
...
socket_id number is too big.You may need to upgrade the perf tool.
# ========
# captured on : Thu Aug 1 22:58:38 2019 # header version : 1 ... # Core ID and Socket ID information is not available ...
With this fix:
[root@localhost perf]# ./perf report --header -I -v
...
cpumask list: 0-31
cpumask list: 32-63
cpumask list: 64-95
cpumask list: 96-127
# ========
# captured on : Thu Aug 1 22:58:38 2019 # header version : 1 ... # CPU 0: Core ID 0, Socket ID 36 # CPU 1: Core ID 1, Socket ID 36 ... # CPU 126: Core ID 126, Socket ID 8442 # CPU 127: Core ID 127, Socket ID 8442 ...
--- tools/perf/util/header.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/util/header.c +3 -1
@@ -2251,8 +2251,10 @@ static int process_cpu_topology(struct feat_fd *ff, void *data __maybe_unused)/* On s390 the socket_id number is not related to the numbers of cpus. * The socket_id number might be higher than the numbers of cpus. * This depends on the configuration. +* AArch64 is the same. */ -if (ph->env.arch && !strncmp (ph->env.arch,"s390" ,4 )) +if (ph->env.arch && (!strncmp (ph->env.arch,"s390" ,4 ) + || !strncmp (ph->env.arch,"aarch64" ,7 ))) do_core_id_test = false;for (i =0 ; i < (u32 )cpu_nr; i++) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 116/344 media: vsp1: fix memory leak of dl on error return path
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 70c55c1ad1a76e804ee5330e134674f5d2741cb7 ]
Currently when the call vsp1_dl_body_get fails and returns null the error return path leaks the allocation of dl. Fix this by kfree'ing dl before returning.
Addresses-Coverity: ("Resource leak")
--- drivers/media/platform/vsp1/vsp1_dl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/vsp1/vsp1_dl.c +3 -1
@@ -557,8 +557,10 @@ static struct vsp1_dl_list *vsp1_dl_list_alloc(struct vsp1_dl_manager *dlm)/* Get a default body for our list. */ dl->body0 =vsp1_dl_body_get (dlm->pool); -if (!dl->body0) +if (!dl->body0) { +kfree (dl);return NULL ; + } header_offset = dl->body0->max_entries *sizeof (*dl->body0->entries);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 117/344 media: i2c: ov5645: Fix power sequence
In reply to Greg Kroah-HartmanFrom: Ezequiel Garcia <[email protected]>
[ Upstream commit 092e8eb90a7dc7dd210cd4e2ea36075d0a7f96af ]
This is mostly a port of Jacopo's fix:
commit aa4bb8b8838ffcc776a79f49a4d7476b82405349
Author: Jacopo Mondi <[email protected]>
Date: Fri Jul 6 05:51:52 2018 -0400
media: ov5640: Re-work MIPI startup sequence
In the OV5645 case, the changes are:
- At set_power(1) time power up MIPI Tx/Rx and set data and clock lanes in LP11 during 'sleep' and 'idle' with MIPI clock in non-continuous mode.
- At set_power(0) time power down MIPI Tx/Rx (in addition to the current power down of regulators and clock gating).
- At s_stream time enable/disable the MIPI interface output.
With this commit the sensor is able to enter LP-11 mode during power up, as expected by some CSI-2 controllers.
Many thanks to Fabio Estevam for his help debugging this issue.
--- drivers/media/i2c/ov5645.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)
drivers/media/i2c/ov5645.c +18 -8
@@ -45,6 +45,8 @@#define OV5645_CHIP_ID_HIGH_BYTE 0x56#define OV5645_CHIP_ID_LOW 0x300b#define OV5645_CHIP_ID_LOW_BYTE 0x45 +#define OV5645_IO_MIPI_CTRL00 0x300e +#define OV5645_PAD_OUTPUT00 0x3019#define OV5645_AWB_MANUAL_CONTROL 0x3406#define OV5645_AWB_MANUAL_ENABLE BIT(0)#define OV5645_AEC_PK_MANUAL 0x3503
@@ -55,6 +57,7 @@#define OV5645_ISP_VFLIP BIT(2)#define OV5645_TIMING_TC_REG21 0x3821#define OV5645_SENSOR_MIRROR BIT(1) +#define OV5645_MIPI_CTRL00 0x4800#define OV5645_PRE_ISP_TEST_SETTING_1 0x503d#define OV5645_TEST_PATTERN_MASK 0x3#define OV5645_SET_TEST_PATTERN (x) ((x) & OV5645_TEST_PATTERN_MASK)
@@ -121,7 +124,6 @@ static const struct reg_value ov5645_global_init_setting[] = { { 0x3503, 0x07 }, { 0x3002, 0x1c }, { 0x3006, 0xc3 }, - { 0x300e, 0x45 }, { 0x3017, 0x00 }, { 0x3018, 0x00 }, { 0x302e, 0x0b },
@@ -350,7 +352,10 @@ static const struct reg_value ov5645_global_init_setting[] = { { 0x3a1f, 0x14 }, { 0x0601, 0x02 }, { 0x3008, 0x42 }, - { 0x3008, 0x02 } + { 0x3008, 0x02 }, + { OV5645_IO_MIPI_CTRL00, 0x40 }, + { OV5645_MIPI_CTRL00, 0x24 }, + { OV5645_PAD_OUTPUT00, 0x70 } }; static const struct reg_value ov5645_setting_sxga[] = {
@@ -737,13 +742,9 @@ static int ov5645_s_power(struct v4l2_subdev *sd, int on) goto exit; } - ret =ov5645_write_reg (ov5645,OV5645_SYSTEM_CTRL0 , -OV5645_SYSTEM_CTRL0_STOP ); -if (ret <0 ) { -ov5645_set_power_off (ov5645); - goto exit; - } +usleep_range (500 ,1000 ); }else { +ov5645_write_reg (ov5645,OV5645_IO_MIPI_CTRL00 ,0x58 );ov5645_set_power_off (ov5645); } }
@@ -1049,11 +1050,20 @@ static int ov5645_s_stream(struct v4l2_subdev *subdev, int enable)dev_err (ov5645->dev,"could not sync v4l2 controls\n" );return ret; } + + ret =ov5645_write_reg (ov5645,OV5645_IO_MIPI_CTRL00 ,0x45 ); +if (ret <0 ) +return ret; + ret =ov5645_write_reg (ov5645,OV5645_SYSTEM_CTRL0 ,OV5645_SYSTEM_CTRL0_START );if (ret <0 )return ret; }else { + ret =ov5645_write_reg (ov5645,OV5645_IO_MIPI_CTRL00 ,0x40 ); +if (ret <0 ) +return ret; + ret =ov5645_write_reg (ov5645,OV5645_SYSTEM_CTRL0 ,OV5645_SYSTEM_CTRL0_STOP );if (ret <0 )
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 118/344 media: omap3isp: Dont set streaming state on random subdevs
In reply to Greg Kroah-HartmanFrom: Sakari Ailus <[email protected]>
[ Upstream commit 7ef57be07ac146e70535747797ef4aee0f06e9f9 ]
The streaming state should be set to the first upstream sub-device only, not everywhere, for a sub-device driver itself knows how to best control the streaming state of its own upstream sub-devices.
--- drivers/media/platform/omap3isp/isp.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/media/platform/omap3isp/isp.c +8 -0
@@ -719,6 +719,10 @@ static int isp_pipeline_enable(struct isp_pipeline *pipe, s_stream, mode); pipe->do_propagation = true; } + +/* Stop at the first external sub-device. */ +if (subdev->dev != isp->dev) +break ; }return 0 ;
@@ -833,6 +837,10 @@ static int isp_pipeline_disable(struct isp_pipeline *pipe) &subdev->entity); failure = -ETIMEDOUT ; } + +/* Stop at the first external sub-device. */ +if (subdev->dev != isp->dev) +break ; }return failure;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 119/344 media: imx: mipi csi-2: Dont fail if initial state times-out
In reply to Greg Kroah-HartmanFrom: Ezequiel Garcia <[email protected]>
[ Upstream commit 0d5078c7172c46db6c58718d817b9fcf769554b4 ]
Not all sensors will be able to guarantee a proper initial state. This may be either because the driver is not properly written, or (probably unlikely) because the hardware won't support it.
While the right solution in the former case is to fix the sensor driver, the real world not always allows right solutions, due to lack of available documentation and support on these sensors.
Let's relax this requirement, and allow the driver to support stream start, even if the sensor initial sequence wasn't the expected.
Also improve the warning message to better explain the problem and provide a hint that the sensor driver needs to be fixed.
--- drivers/staging/media/imx/imx6-mipi-csi2.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
drivers/staging/media/imx/imx6-mipi-csi2.c +4 -8
@@ -243,7 +243,7 @@ static int __maybe_unused csi2_dphy_wait_ulp(struct csi2_dev *csi2) }/* Waits for low-power LP-11 state on data and clock lanes. */ -static int csi2_dphy_wait_stopstate (struct csi2_dev *csi2) +static void csi2_dphy_wait_stopstate (struct csi2_dev *csi2) {u32 mask, reg;int ret;
@@ -254,11 +254,9 @@ static int csi2_dphy_wait_stopstate(struct csi2_dev *csi2) ret =readl_poll_timeout (csi2->base +CSI2_PHY_STATE , reg, (reg & mask) == mask,0 ,500000 );if (ret) { -v4l2_err (&csi2->sd,"LP-11 timeout, phy_state = 0x%08x\n" , reg); -return ret; +v4l2_warn (&csi2->sd,"LP-11 wait timeout, likely a sensor driver bug, expect capture failures.\n" ); +v4l2_warn (&csi2->sd,"phy_state = 0x%08x\n" , reg); } - -return 0 ; }/* Wait for active clock on the clock lane. */
@@ -316,9 +314,7 @@ static int csi2_start(struct csi2_dev *csi2)csi2_enable (csi2, true);/* Step 5 */ - ret =csi2_dphy_wait_stopstate (csi2); -if (ret) - goto err_assert_reset; +csi2_dphy_wait_stopstate (csi2);/* Step 6 */ ret =v4l2_subdev_call (csi2->src_sd, video, s_stream,1 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 120/344 kasan/arm64: fix CONFIG_KASAN_SW_TAGS && KASAN_INLINE
In reply to Greg Kroah-HartmanFrom: Mark Rutland <[email protected]>
[ Upstream commit 34b5560db40d2941cfbe82eca1641353d5aed1a9 ]
The generic Makefile.kasan propagates CONFIG_KASAN_SHADOW_OFFSET into KASAN_SHADOW_OFFSET, but only does so for CONFIG_KASAN_GENERIC.
Since commit:
6bd1d0be0e97936d ("arm64: kasan: Switch to using KASAN_SHADOW_OFFSET")
... arm64 defines CONFIG_KASAN_SHADOW_OFFSET in Kconfig rather than defining KASAN_SHADOW_OFFSET in a Makefile. Thus, if CONFIG_KASAN_SW_TAGS && KASAN_INLINE are selected, we get build time splats due to KASAN_SHADOW_OFFSET not being set:
| [mark@lakrids:~/src/linux]% usellvm 8.0.1 usekorg 8.1.0 make ARCH=arm64 CROSS_COMPILE=aarch64-linux- CC=clang | scripts/kconfig/conf --syncconfig Kconfig | CC scripts/mod/empty.o | clang (LLVM option parsing): for the -hwasan-mapping-offset option: '' value invalid for uint argument! | scripts/Makefile.build:273: recipe for target 'scripts/mod/empty.o' failed | make[1]: *** [scripts/mod/empty.o] Error 1 | Makefile:1123: recipe for target 'prepare0' failed | make: *** [prepare0] Error 2
Let's fix this by always propagating CONFIG_KASAN_SHADOW_OFFSET into KASAN_SHADOW_OFFSET if CONFIG_KASAN is selected, moving the existing common definition of +CFLAGS_KASAN_NOSANITIZE to the top of Makefile.kasan.
Tested-by Steve Capper <[email protected]>
--- scripts/Makefile.kasan | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
scripts/Makefile.kasan +5 -6
@@ -1,4 +1,9 @@ # SPDX-License-Identifier: GPL-2.0 +ifdef CONFIG_KASAN +CFLAGS_KASAN_NOSANITIZE := -fno-builtin +KASAN_SHADOW_OFFSET ?= $(CONFIG_KASAN_SHADOW_OFFSET) +endif + ifdef CONFIG_KASAN_GENERIC ifdef CONFIG_KASAN_INLINE
@@ -7,8 +12,6 @@ else call_threshold := 0 endif -KASAN_SHADOW_OFFSET ?= $(CONFIG_KASAN_SHADOW_OFFSET) - CFLAGS_KASAN_MINIMAL := -fsanitize=kernel-address cc-param = $(call cc-option, -mllvm -$(1), $(call cc-option, --param $(1)))
@@ -45,7 +48,3 @@ CFLAGS_KASAN := -fsanitize=kernel-hwaddress \ $(instrumentation_flags) endif # CONFIG_KASAN_SW_TAGS - -ifdef CONFIG_KASAN -CFLAGS_KASAN_NOSANITIZE := -fno-builtin -endif
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 121/344 net: lpc-enet: fix printk format strings
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit de6f97b2bace0e2eb6c3a86e124d1e652a587b56 ]
compile-testing this driver on other architectures showed multiple warnings:
drivers/net/ethernet/nxp/lpc_eth.c: In function 'lpc_eth_drv_probe':
drivers/net/ethernet/nxp/lpc_eth.c:1337:19: warning: format '%d' expects argument of type 'int', but argument 4 has type 'resource_size_t {aka long long unsigned int}' [-Wformat=]
drivers/net/ethernet/nxp/lpc_eth.c:1342:19: warning: format '%x' expects argument of type 'unsigned int', but argument 4 has type 'dma_addr_t {aka long long unsigned int}' [-Wformat=]
Use format strings that work on all architectures.
--- drivers/net/ethernet/nxp/lpc_eth.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/net/ethernet/nxp/lpc_eth.c +7 -6
@@ -1344,13 +1344,14 @@ static int lpc_eth_drv_probe(struct platform_device *pdev) pldat->dma_buff_base_p = dma_handle;netdev_dbg (ndev,"IO address space :%pR\n" , res); -netdev_dbg (ndev,"IO address size :%d\n" ,resource_size (res)); +netdev_dbg (ndev,"IO address size :%zd\n" , + (size_t )resource_size (res));netdev_dbg (ndev,"IO address (mapped) :0x%p\n" , pldat->net_base);netdev_dbg (ndev,"IRQ number :%d\n" , ndev->irq); -netdev_dbg (ndev,"DMA buffer size :%d\n" , pldat->dma_buff_size); -netdev_dbg (ndev,"DMA buffer P address :0x%08x\n" , - pldat->dma_buff_base_p); +netdev_dbg (ndev,"DMA buffer size :%zd\n" , pldat->dma_buff_size); +netdev_dbg (ndev,"DMA buffer P address :%pad\n" , + &pldat->dma_buff_base_p);netdev_dbg (ndev,"DMA buffer V address :0x%p\n" , pldat->dma_buff_base_v);
@@ -1397,8 +1398,8 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)if (ret) goto err_out_unregister_netdev; -netdev_info (ndev,"LPC mac at 0x%08x irq %d\n" , - res->start, ndev->irq); +netdev_info (ndev,"LPC mac at 0x%08lx irq %d\n" , + (unsigned long )res->start, ndev->irq);device_init_wakeup (dev,1 );device_set_wakeup_enable (dev,0 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 122/344 m68k: Prevent some compiler warnings in Coldfire builds
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit 94c04390225bcd8283103fd0c04be20cc30cc979 ]
Since commit d3b41b6bb49e ("m68k: Dispatch nvram_ops calls to Atari or Mac functions"), Coldfire builds generate compiler warnings due to the unconditional inclusion of asm/atarihw.h and asm/macintosh.h.
The inclusion of asm/atarihw.h causes warnings like this:
In file included from ./arch/m68k/include/asm/atarihw.h:25:0,
from arch/m68k/kernel/setup_mm.c:41,
from arch/m68k/kernel/setup.c:3:./arch/m68k/include/asm/raw_io.h:39:0: warning: "__raw_readb" redefined
#define __raw_readb in_8
In file included from ./arch/m68k/include/asm/io.h:6:0,
from arch/m68k/kernel/setup_mm.c:36,
from arch/m68k/kernel/setup.c:3:./arch/m68k/include/asm/io_no.h:16:0: note: this is the location of the previous definition
#define __raw_readb(addr) \
...
This issue is resolved by dropping the asm/raw_io.h include. It turns out that asm/io_mm.h already includes that header file.
Moving the relevant macro definitions helps to clarify this dependency and make it safe to include asm/atarihw.h.
The other warnings look like this:
In file included from arch/m68k/kernel/setup_mm.c:48:0,
from arch/m68k/kernel/setup.c:3:
./arch/m68k/include/asm/macintosh.h:19:35: warning: 'struct irq_data' declared inside parameter list will not be visible outside of this definition or declaration
extern void mac_irq_enable(struct irq_data *data);
^~~~~~~~...
This issue is resolved by adding the missing linux/irq.h include.
--- arch/m68k/include/asm/atarihw.h | 9 --------- arch/m68k/include/asm/io_mm.h | 6 +++++- arch/m68k/include/asm/macintosh.h | 1 + 3 files changed, 6 insertions(+), 10 deletions(-)
arch/m68k/include/asm/atarihw.h +0 -9
@@ -22,7 +22,6 @@#include <linux/types.h> #include <asm/bootinfo-atari.h> -#include <asm/raw_io.h> #include <asm/kmap.h> extern u_long atari_mch_cookie;
@@ -132,14 +131,6 @@ extern struct atari_hw_present atari_hw_present;*/ -#define atari_readb raw_inb -#define atari_writeb raw_outb - -#define atari_inb_p raw_inb -#define atari_outb_p raw_outb - - -#include <linux/mm.h> #include <asm/cacheflush.h>
arch/m68k/include/asm/io_mm.h +5 -1
@@ -29,7 +29,11 @@#include <asm-generic/iomap.h> #ifdef CONFIG_ATARI -#include <asm/atarihw.h> +#define atari_readb raw_inb +#define atari_writeb raw_outb + +#define atari_inb_p raw_inb +#define atari_outb_p raw_outb#endif
arch/m68k/include/asm/macintosh.h +1 -0
@@ -4,6 +4,7 @@#include <linux/seq_file.h> #include <linux/interrupt.h> +#include <linux/irq.h> #include <asm/bootinfo-mac.h>
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 123/344 ARM: dts: imx7d: cl-som-imx7: make ethernet work again
In reply to Greg Kroah-HartmanFrom: André Draszik <[email protected]>
[ Upstream commit 9846a4524ac90b63496580b7ad50674b40d92a8f ]
Recent changes to the atheros at803x driver caused ethernet to stop working on this board.
In particular commit 6d4cd041f0af
("net: phy: at803x: disable delay only for RGMII mode") and commit cd28d1d6e52e
("net: phy: at803x: Disable phy delay for RGMII mode") fix the AR8031 driver to configure the phy's (RX/TX) delays as per the 'phy-mode' in the device tree.
This now prevents ethernet from working on this board.
It used to work before those commits, because the AR8031 comes out of reset with RX delay enabled, and the at803x driver didn't touch the delay configuration at all when "rgmii" mode was selected, and because arch/arm/mach-imx/mach-imx7d.c:ar8031_phy_fixup() unconditionally enables TX delay.
Since above commits ar8031_phy_fixup() also has no effect anymore, and the end-result is that all delays are disabled in the phy, no ethernet.
Update the device tree to restore functionality.
--- arch/arm/boot/dts/imx7d-cl-som-imx7.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx7d-cl-som-imx7.dts +2 -2
@@ -44,7 +44,7 @@ <&clks IMX7D_ENET1_TIME_ROOT_CLK>; assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>; assigned-clock-rates = <0>, <100000000>; - phy-mode = "rgmii"; + phy-mode = "rgmii-id"; phy-handle = <ðphy0>; fsl,magic-packet; status = "okay";
@@ -70,7 +70,7 @@ <&clks IMX7D_ENET2_TIME_ROOT_CLK>; assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>; assigned-clock-rates = <0>, <100000000>; - phy-mode = "rgmii"; + phy-mode = "rgmii-id"; phy-handle = <ðphy1>; fsl,magic-packet; status = "okay";
Signature · 9 lines
2.20.1 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Greg Kroah-Hartman
maintainerPATCH 124/344 arm64: dts: qcom: qcs404-evb: Mark WCSS clocks protected
In reply to Greg Kroah-HartmanFrom: Bjorn Andersson <[email protected]>
[ Upstream commit 54d895bea43c94f31304d59f82d755b7f4b59e7c ]
'7d0c76bdf227 ("clk: qcom: Add WCSS gcc clock control for QCS404")' introduces two new clocks to gcc. These are not used before clk_disable_unused() and as such the clock framework tries to disable them.
But on the EVB these registers are only accessible through TrustZone, so these clocks must be marked as "protected" to prevent the clock code from touching them.
Numerical values are used as the constants are not yet available in a common tree.
--- arch/arm64/boot/dts/qcom/qcs404-evb.dtsi | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/qcs404-evb.dtsi +3 -1
@@ -61,7 +61,9 @@ protected-clocks = <GCC_BIMC_CDSP_CLK>, <GCC_CDSP_CFG_AHB_CLK>, <GCC_CDSP_BIMC_CLK_SRC>, - <GCC_CDSP_TBU_CLK>; + <GCC_CDSP_TBU_CLK>, + <141>, /* GCC_WCSS_Q6_AHB_CLK */ + <142>; /* GCC_WCSS_Q6_AXIM_CLK */ }; &pms405_spmi_regulators {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 125/344 ARM: dts: imx7-colibri: disable HS400
In reply to Greg Kroah-HartmanFrom: Stefan Agner <[email protected]>
[ Upstream commit a95fbda08ee20cd063ce5826e0df95a2c22ea8c5 ]
Force HS200 by masking bit 63 of the SDHCI capability register. The i.MX ESDHC driver uses SDHCI_QUIRK2_CAPS_BIT63_FOR_HS400. With that the stack checks bit 63 to descide whether HS400 is available. Using sdhci-caps-mask allows to mask bit 63. The stack then selects HS200 as operating mode.
This prevents rare communication errors with minimal effect on performance:
sdhci-esdhc-imx 30b60000.usdhc: warning! HS400 strobe DLL status REF not lock!
--- arch/arm/boot/dts/imx7-colibri.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm/boot/dts/imx7-colibri.dtsi +1 -0
@@ -323,6 +323,7 @@ vmmc-supply = <®_module_3v3>; vqmmc-supply = <®_DCDC3>; non-removable; + sdhci-caps-mask = <0x80000000 0x0>; }; &iomuxc {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 126/344 x86/platform/intel/iosf_mbi Rewrite locking
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 00452ba9fdb5bf6fb5fea1dae5227b4bbed44fc4 ]
There are 2 problems with the old iosf PMIC I2C bus arbritration code which need to be addressed:
1. The lockdep code complains about a possible deadlock in the iosf_mbi_[un]block_punit_i2c_access code:
[ 6.712662] ======================================================
[ 6.712673] WARNING: possible circular locking dependency detected
[ 6.712685] 5.3.0-rc2+ #79 Not tainted
[ 6.712692] ------------------------------------------------------
[ 6.712702] kworker/0:1/7 is trying to acquire lock:
[ 6.712712] 00000000df1c5681 (iosf_mbi_block_punit_i2c_access_count_mutex){+.+.}, at: iosf_mbi_unblock_punit_i2c_access+0x13/0x90
[ 6.712739]
but task is already holding lock:
[ 6.712749] 0000000067cb23e7 (iosf_mbi_punit_mutex){+.+.}, at: iosf_mbi_block_punit_i2c_access+0x97/0x186
[ 6.712768]
which lock already depends on the new lock.[ 6.712780]
the existing dependency chain (in reverse order) is:
[ 6.712792]
-> #1 (iosf_mbi_punit_mutex){+.+.}:
[ 6.712808] __mutex_lock+0xa8/0x9a0
[ 6.712818] iosf_mbi_block_punit_i2c_access+0x97/0x186
[ 6.712831] i2c_dw_acquire_lock+0x20/0x30
[ 6.712841] i2c_dw_set_reg_access+0x15/0xb0
[ 6.712851] i2c_dw_probe+0x57/0x473
[ 6.712861] dw_i2c_plat_probe+0x33e/0x640
[ 6.712874] platform_drv_probe+0x38/0x80
[ 6.712884] really_probe+0xf3/0x380
[ 6.712894] driver_probe_device+0x59/0xd0
[ 6.712905] bus_for_each_drv+0x84/0xd0
[ 6.712915] __device_attach+0xe4/0x170
[ 6.712925] bus_probe_device+0x9f/0xb0
[ 6.712935] deferred_probe_work_func+0x79/0xd0
[ 6.712946] process_one_work+0x234/0x560
[ 6.712957] worker_thread+0x50/0x3b0
[ 6.712967] kthread+0x10a/0x140
[ 6.712977] ret_from_fork+0x3a/0x50
[ 6.712986]
-> #0 (iosf_mbi_block_punit_i2c_access_count_mutex){+.+.}:
[ 6.713004] __lock_acquire+0xe07/0x1930
[ 6.713015] lock_acquire+0x9d/0x1a0
[ 6.713025] __mutex_lock+0xa8/0x9a0
[ 6.713035] iosf_mbi_unblock_punit_i2c_access+0x13/0x90
[ 6.713047] i2c_dw_set_reg_access+0x4d/0xb0
[ 6.713058] i2c_dw_probe+0x57/0x473
[ 6.713068] dw_i2c_plat_probe+0x33e/0x640
[ 6.713079] platform_drv_probe+0x38/0x80
[ 6.713089] really_probe+0xf3/0x380
[ 6.713099] driver_probe_device+0x59/0xd0
[ 6.713109] bus_for_each_drv+0x84/0xd0
[ 6.713119] __device_attach+0xe4/0x170
[ 6.713129] bus_probe_device+0x9f/0xb0
[ 6.713140] deferred_probe_work_func+0x79/0xd0
[ 6.713150] process_one_work+0x234/0x560
[ 6.713160] worker_thread+0x50/0x3b0
[ 6.713170] kthread+0x10a/0x140
[ 6.713180] ret_from_fork+0x3a/0x50
[ 6.713189]
other info that might help us debug this:[ 6.713202] Possible unsafe locking scenario:
[ 6.713212] CPU0 CPU1
[ 6.713221] ---- ----
[ 6.713229] lock(iosf_mbi_punit_mutex);
[ 6.713239] lock(iosf_mbi_block_punit_i2c_access_count_mutex);
[ 6.713253] lock(iosf_mbi_punit_mutex);
[ 6.713265] lock(iosf_mbi_block_punit_i2c_access_count_mutex);
[ 6.713276]
*** DEADLOCK ***In practice can never happen because only the first caller which increments iosf_mbi_block_punit_i2c_access_count will also take iosf_mbi_punit_mutex, that is the whole purpose of the counter, which itself is protected by iosf_mbi_block_punit_i2c_access_count_mutex.
But there is no way to tell the lockdep code about this and we really want to be able to run a kernel with lockdep enabled without these warnings being triggered.
2. The lockdep warning also points out another real problem, if 2 threads both are in a block of code protected by iosf_mbi_block_punit_i2c_access and the first thread to acquire the block exits before the second thread then the second thread will call mutex_unlock on iosf_mbi_punit_mutex, but it is not the thread which took the mutex and unlocking by another thread is not allowed.
Fix this by getting rid of the notion of holding a mutex for the entire duration of the PMIC accesses, be it either from the PUnit side, or from an in kernel I2C driver. In general holding a mutex after exiting a function is a bad idea and the above problems show this case is no different.
Instead 2 counters are now used, one for PMIC accesses from the PUnit and one for accesses from in kernel I2C code. When access is requested now the code will wait (using a waitqueue) for the counter of the other type of access to reach 0 and on release, if the counter reaches 0 the wakequeue is woken.
Note that the counter approach is necessary to allow nested calls. The main reason for this is so that a series of i2c transfers can be done with the punit blocked from accessing the bus the whole time. This is necessary to be able to safely read/modify/write a PMIC register without racing with the PUNIT doing the same thing.
Allowing nested iosf_mbi_block_punit_i2c_access() calls also is desirable from a performance pov since the whole dance necessary to block the PUnit from accessing the PMIC I2C bus is somewhat expensive.
--- arch/x86/platform/intel/iosf_mbi.c | 100 ++++++++++++++++++----------- 1 file changed, 62 insertions(+), 38 deletions(-)
arch/x86/platform/intel/iosf_mbi.c +62 -38
@@ -17,6 +17,7 @@#include <linux/debugfs.h> #include <linux/capability.h> #include <linux/pm_qos.h> +#include <linux/wait.h> #include <asm/iosf_mbi.h>
@@ -201,23 +202,45 @@ EXPORT_SYMBOL(iosf_mbi_available);#define PUNIT_SEMAPHORE_BIT BIT(0)#define PUNIT_SEMAPHORE_ACQUIRE BIT(1) -static DEFINE_MUTEX (iosf_mbi_punit_mutex); -static DEFINE_MUTEX (iosf_mbi_block_punit_i2c_access_count_mutex); +static DEFINE_MUTEX (iosf_mbi_pmic_access_mutex);static BLOCKING_NOTIFIER_HEAD (iosf_mbi_pmic_bus_access_notifier); -static u32 iosf_mbi_block_punit_i2c_access_count; +static DECLARE_WAIT_QUEUE_HEAD (iosf_mbi_pmic_access_waitq); +static u32 iosf_mbi_pmic_punit_access_count; +static u32 iosf_mbi_pmic_i2c_access_count;static u32 iosf_mbi_sem_address;static unsigned long iosf_mbi_sem_acquired;static struct pm_qos_request iosf_mbi_pm_qos;void iosf_mbi_punit_acquire (void ) { -mutex_lock (&iosf_mbi_punit_mutex); +/* Wait for any I2C PMIC accesses from in kernel drivers to finish. */ +mutex_lock (&iosf_mbi_pmic_access_mutex); +while (iosf_mbi_pmic_i2c_access_count !=0 ) { +mutex_unlock (&iosf_mbi_pmic_access_mutex); +wait_event (iosf_mbi_pmic_access_waitq, + iosf_mbi_pmic_i2c_access_count ==0 ); +mutex_lock (&iosf_mbi_pmic_access_mutex); + } +/* +* We do not need to do anything to allow the PUNIT to safely access +* the PMIC, other then block in kernel accesses to the PMIC. +*/ + iosf_mbi_pmic_punit_access_count++; +mutex_unlock (&iosf_mbi_pmic_access_mutex); }EXPORT_SYMBOL (iosf_mbi_punit_acquire);void iosf_mbi_punit_release (void ) { -mutex_unlock (&iosf_mbi_punit_mutex); +bool do_wakeup; + +mutex_lock (&iosf_mbi_pmic_access_mutex); + iosf_mbi_pmic_punit_access_count--; + do_wakeup = iosf_mbi_pmic_punit_access_count ==0 ; +mutex_unlock (&iosf_mbi_pmic_access_mutex); + +if (do_wakeup) +wake_up (&iosf_mbi_pmic_access_waitq); }EXPORT_SYMBOL (iosf_mbi_punit_release);
@@ -256,34 +279,32 @@ static void iosf_mbi_reset_semaphore(void)* already blocked P-Unit accesses because it wants them blocked over multiple * i2c-transfers, for e.g. read-modify-write of an I2C client register. * -* The P-Unit accesses already being blocked is tracked through the -* iosf_mbi_block_punit_i2c_access_count variable which is protected by the -* iosf_mbi_block_punit_i2c_access_count_mutex this mutex is hold for the -* entire duration of the function. -* -* If access is not blocked yet, this function takes the following steps: +* To allow safe PMIC i2c bus accesses this function takes the following steps: * * 1) Some code sends request to the P-Unit which make it access the PMIC * I2C bus. Testing has shown that the P-Unit does not check its internal * PMIC bus semaphore for these requests. Callers of these requests call * iosf_mbi_punit_acquire()/_release() around their P-Unit accesses, these -* functions lock/unlock the iosf_mbi_punit_mutex. -* As the first step we lock the iosf_mbi_punit_mutex, to wait for any in -* flight requests to finish and to block any new requests. +* functions increase/decrease iosf_mbi_pmic_punit_access_count, so first +* we wait for iosf_mbi_pmic_punit_access_count to become 0. +* +* 2) Check iosf_mbi_pmic_i2c_access_count, if access has already +* been blocked by another caller, we only need to increment +* iosf_mbi_pmic_i2c_access_count and we can skip the other steps. * -* 2) Some code makes such P-Unit requests from atomic contexts where it +* 3) Some code makes such P-Unit requests from atomic contexts where it * cannot call iosf_mbi_punit_acquire() as that may sleep. * As the second step we call a notifier chain which allows any code * needing P-Unit resources from atomic context to acquire them before * we take control over the PMIC I2C bus. * -* 3) When CPU cores enter C6 or C7 the P-Unit needs to talk to the PMIC +* 4) When CPU cores enter C6 or C7 the P-Unit needs to talk to the PMIC * if this happens while the kernel itself is accessing the PMIC I2C bus * the SoC hangs. * As the third step we call pm_qos_update_request() to disallow the CPU * to enter C6 or C7. * -* 4) The P-Unit has a PMIC bus semaphore which we can request to stop +* 5) The P-Unit has a PMIC bus semaphore which we can request to stop * autonomous P-Unit tasks from accessing the PMIC I2C bus while we hold it. * As the fourth and final step we request this semaphore and wait for our * request to be acknowledged.
@@ -297,12 +318,18 @@ int iosf_mbi_block_punit_i2c_access(void)if (WARN_ON (!mbi_pdev || !iosf_mbi_sem_address))return -ENXIO ; -mutex_lock (&iosf_mbi_block_punit_i2c_access_count_mutex); +mutex_lock (&iosf_mbi_pmic_access_mutex); -if (iosf_mbi_block_punit_i2c_access_count >0 ) +while (iosf_mbi_pmic_punit_access_count !=0 ) { +mutex_unlock (&iosf_mbi_pmic_access_mutex); +wait_event (iosf_mbi_pmic_access_waitq, + iosf_mbi_pmic_punit_access_count ==0 ); +mutex_lock (&iosf_mbi_pmic_access_mutex); + } + +if (iosf_mbi_pmic_i2c_access_count >0 ) goto success; -mutex_lock (&iosf_mbi_punit_mutex);blocking_notifier_call_chain (&iosf_mbi_pmic_bus_access_notifier,MBI_PMIC_BUS_ACCESS_BEGIN ,NULL );
@@ -330,10 +357,6 @@ int iosf_mbi_block_punit_i2c_access(void) iosf_mbi_sem_acquired = jiffies;dev_dbg (&mbi_pdev->dev,"P-Unit semaphore acquired after %ums\n" ,jiffies_to_msecs (jiffies - start)); -/* -* Success, keep iosf_mbi_punit_mutex locked till -* iosf_mbi_unblock_punit_i2c_access() gets called. -*/ goto success; }
@@ -344,15 +367,13 @@ int iosf_mbi_block_punit_i2c_access(void)dev_err (&mbi_pdev->dev,"Error P-Unit semaphore timed out, resetting\n" ); error:iosf_mbi_reset_semaphore (); -mutex_unlock (&iosf_mbi_punit_mutex); -if (!iosf_mbi_get_sem (&sem))dev_err (&mbi_pdev->dev,"P-Unit semaphore: %d\n" , sem); success:if (!WARN_ON (ret)) - iosf_mbi_block_punit_i2c_access_count++; + iosf_mbi_pmic_i2c_access_count++; -mutex_unlock (&iosf_mbi_block_punit_i2c_access_count_mutex); +mutex_unlock (&iosf_mbi_pmic_access_mutex);return ret; }
@@ -360,17 +381,20 @@ EXPORT_SYMBOL(iosf_mbi_block_punit_i2c_access);void iosf_mbi_unblock_punit_i2c_access (void ) { -mutex_lock (&iosf_mbi_block_punit_i2c_access_count_mutex); +bool do_wakeup = false; - iosf_mbi_block_punit_i2c_access_count--; -if (iosf_mbi_block_punit_i2c_access_count ==0 ) { +mutex_lock (&iosf_mbi_pmic_access_mutex); + iosf_mbi_pmic_i2c_access_count--; +if (iosf_mbi_pmic_i2c_access_count ==0 ) {iosf_mbi_reset_semaphore (); -mutex_unlock (&iosf_mbi_punit_mutex);dev_dbg (&mbi_pdev->dev,"punit semaphore held for %ums\n" ,jiffies_to_msecs (jiffies - iosf_mbi_sem_acquired)); + do_wakeup = true; } +mutex_unlock (&iosf_mbi_pmic_access_mutex); -mutex_unlock (&iosf_mbi_block_punit_i2c_access_count_mutex); +if (do_wakeup) +wake_up (&iosf_mbi_pmic_access_waitq); }EXPORT_SYMBOL (iosf_mbi_unblock_punit_i2c_access);
@@ -379,10 +403,10 @@ int iosf_mbi_register_pmic_bus_access_notifier(struct notifier_block *nb)int ret;/* Wait for the bus to go inactive before registering */ -mutex_lock (&iosf_mbi_punit_mutex); +iosf_mbi_punit_acquire (); ret =blocking_notifier_chain_register ( &iosf_mbi_pmic_bus_access_notifier, nb); -mutex_unlock (&iosf_mbi_punit_mutex); +iosf_mbi_punit_release ();return ret; }
@@ -403,9 +427,9 @@ int iosf_mbi_unregister_pmic_bus_access_notifier(struct notifier_block *nb)int ret;/* Wait for the bus to go inactive before unregistering */ -mutex_lock (&iosf_mbi_punit_mutex); +iosf_mbi_punit_acquire (); ret =iosf_mbi_unregister_pmic_bus_access_notifier_unlocked (nb); -mutex_unlock (&iosf_mbi_punit_mutex); +iosf_mbi_punit_release ();return ret; }
@@ -413,7 +437,7 @@ EXPORT_SYMBOL(iosf_mbi_unregister_pmic_bus_access_notifier);void iosf_mbi_assert_punit_acquired (void ) { -WARN_ON (!mutex_is_locked (&iosf_mbi_punit_mutex)); +WARN_ON (iosf_mbi_pmic_punit_access_count ==0 ); }EXPORT_SYMBOL (iosf_mbi_assert_punit_acquired);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 127/344 media: radio/si470x: kill urb on error
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
[ Upstream commit 0d616f2a3fdbf1304db44d451d9f07008556923b ]
In the probe() function radio->int_in_urb was not killed if an error occurred in the probe sequence. It was also missing in the disconnect.
This caused this syzbot issue:
https://syzkaller.appspot.com/bug?extid=2d4fc2a0c45ad8da7e99
--- drivers/media/radio/si470x/radio-si470x-usb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/media/radio/si470x/radio-si470x-usb.c +4 -1
@@ -734,7 +734,7 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,/* start radio */ retval =si470x_start_usb (radio);if (retval <0 ) - goto err_all; + goto err_buf;/* set initial frequency */ si470x_set_freq (radio,87.5 *FREQ_MUL );/* available in all regions */
@@ -749,6 +749,8 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,return 0 ; err_all: +usb_kill_urb (radio->int_in_urb); +err_buf:kfree (radio->buffer); err_ctrl:v4l2_ctrl_handler_free (&radio->hdl);
@@ -822,6 +824,7 @@ static void si470x_usb_driver_disconnect(struct usb_interface *intf)mutex_lock (&radio->lock);v4l2_device_disconnect (&radio->v4l2_dev);video_unregister_device (&radio->videodev); +usb_kill_urb (radio->int_in_urb);usb_set_intfdata (intf,NULL );mutex_unlock (&radio->lock);v4l2_device_put (&radio->v4l2_dev);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 128/344 media: hdpvr: add terminating 0 at end of string
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
[ Upstream commit 8b8900b729e4f31f12ac1127bde137c775c327e6 ]
dev->usbc_buf was passed as argument for %s, but it was not safeguarded by a terminating 0.
This caused this syzbot issue:
https://syzkaller.appspot.com/bug?extid=79d18aac4bf1770dd050
--- drivers/media/usb/hdpvr/hdpvr-core.c | 1 + 1 file changed, 1 insertion(+)
drivers/media/usb/hdpvr/hdpvr-core.c +1 -0
@@ -137,6 +137,7 @@ static int device_authorization(struct hdpvr_device *dev) dev->fw_ver = dev->usbc_buf[1 ]; + dev->usbc_buf[46 ] ='\0' ;v4l2_info (&dev->v4l2_dev,"firmware version 0x%x dated %s\n" , dev->fw_ver, &dev->usbc_buf[2 ]);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 129/344 ASoC: uniphier: Fix double reset assersion when transitioning to suspend state
In reply to Greg Kroah-HartmanFrom: Kunihiko Hayashi <[email protected]>
[ Upstream commit c372a35550c8d60f673b20210eea58a06d6d38cb ]
When transitioning to supend state, uniphier_aio_dai_suspend() is called and asserts reset lines and disables clocks.
However, if there are two or more DAIs, uniphier_aio_dai_suspend() are called multiple times, and double reset assersion will cause.
This patch defines the counter that has the number of DAIs at first, and whenever uniphier_aio_dai_suspend() are called, it decrements the counter. And only if the counter is zero, it asserts reset lines and disables clocks.
In the same way, uniphier_aio_dai_resume() are called, it increments the counter after deasserting reset lines and enabling clocks.
--- sound/soc/uniphier/aio-cpu.c | 31 +++++++++++++++++++++---------- sound/soc/uniphier/aio.h | 1 + 2 files changed, 22 insertions(+), 10 deletions(-)
sound/soc/uniphier/aio-cpu.c +21 -10
@@ -424,8 +424,11 @@ int uniphier_aio_dai_suspend(struct snd_soc_dai *dai) {struct uniphier_aio *aio =uniphier_priv (dai); -reset_control_assert (aio->chip->rst); -clk_disable_unprepare (aio->chip->clk); + aio->chip->num_wup_aios--; +if (!aio->chip->num_wup_aios) { +reset_control_assert (aio->chip->rst); +clk_disable_unprepare (aio->chip->clk); + }return 0 ; }
@@ -439,13 +442,15 @@ int uniphier_aio_dai_resume(struct snd_soc_dai *dai)if (!aio->chip->active)return 0 ; - ret =clk_prepare_enable (aio->chip->clk); -if (ret) -return ret; +if (!aio->chip->num_wup_aios) { + ret =clk_prepare_enable (aio->chip->clk); +if (ret) +return ret; - ret =reset_control_deassert (aio->chip->rst); -if (ret) - goto err_out_clock; + ret =reset_control_deassert (aio->chip->rst); +if (ret) + goto err_out_clock; + }aio_iecout_set_enable (aio->chip, true);aio_chip_init (aio->chip);
@@ -458,7 +463,7 @@ int uniphier_aio_dai_resume(struct snd_soc_dai *dai) ret =aio_init (sub);if (ret) - goto err_out_clock; + goto err_out_reset;if (!sub->setting)continue ;
@@ -466,11 +471,16 @@ int uniphier_aio_dai_resume(struct snd_soc_dai *dai)aio_port_reset (sub);aio_src_reset (sub); } + aio->chip->num_wup_aios++;return 0 ; +err_out_reset: +if (!aio->chip->num_wup_aios) +reset_control_assert (aio->chip->rst); err_out_clock: -clk_disable_unprepare (aio->chip->clk); +if (!aio->chip->num_wup_aios) +clk_disable_unprepare (aio->chip->clk);return ret; }
@@ -619,6 +629,7 @@ int uniphier_aio_probe(struct platform_device *pdev)return PTR_ERR (chip->rst); chip->num_aios = chip->chip_spec->num_dais; + chip->num_wup_aios = chip->num_aios; chip->aios =devm_kcalloc (dev, chip->num_aios,sizeof (struct uniphier_aio ),GFP_KERNEL );
sound/soc/uniphier/aio.h +1 -0
@@ -285,6 +285,7 @@ struct uniphier_aio_chip {struct uniphier_aio *aios;int num_aios; +int num_wup_aios;struct uniphier_aio_pll *plls;int num_plls;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 130/344 powerpc/Makefile: Always pass --synthetic to nm if supported
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit 117acf5c29dd89e4c86761c365b9724dba0d9763 ]
Back in 2004 we added logic to arch/ppc64/Makefile to pass the --synthetic option to nm, if it was supported by nm.
Then in 2005 when arch/ppc64 and arch/ppc were merged, the logic to add --synthetic was moved inside an #ifdef CONFIG_PPC64 block within arch/powerpc/Makefile, and has remained there since.
That was fine, though crufty, until recently when a change to init/Kconfig added a config time check that uses $(NM). On powerpc that leads to an infinite loop because Kconfig uses $(NM) to calculate some values, then the powerpc Makefile changes $(NM), which Kconfig notices and restarts.
The original commit that added --synthetic simply said:
On new toolchains we need to use nm --synthetic or we miss code symbols.
And the nm man page says that the --synthetic option causes nm to:
Include synthetic symbols in the output. These are special symbols created by the linker for various purposes.
So it seems safe to always pass --synthetic if nm supports it, ie. on 32-bit and 64-bit, it just means 32-bit kernels might have more symbols reported (and in practice I see no extra symbols). Making it unconditional avoids the #ifdef CONFIG_PPC64, which in turn avoids the infinite loop.
--- arch/powerpc/Makefile | 2 -- 1 file changed, 2 deletions(-)
arch/powerpc/Makefile +0 -2
@@ -39,13 +39,11 @@ endif uname := $(shell uname -m) KBUILD_DEFCONFIG := $(if $(filter ppc%,$(uname)),$(uname),ppc64)_defconfig -ifdef CONFIG_PPC64 new_nm := $(shell if $(NM) --help 2>&1 | grep -- '--synthetic' > /dev/null; then echo y; else echo n; fi) ifeq ($(new_nm),y) NM := $(NM) --synthetic endif -endif # BITS is used as extension for files which are available in a 32 bit # and a 64 bit version to simplify shared Makefiles.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 131/344 tools headers: Fixup bitsperlong per arch includes
In reply to Greg Kroah-HartmanFrom: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit 42fc2e9ef9603a7948aaa4ffd8dfb94b30294ad8 ]
We were getting the file by luck, from one of the paths in -I, fix it to get it from the proper place:
$ cd tools/include/uapi/asm/ [acme@quaco asm]$ grep include bitsperlong.h #include "../../arch/x86/include/uapi/asm/bitsperlong.h" #include "../../arch/arm64/include/uapi/asm/bitsperlong.h" #include "../../arch/powerpc/include/uapi/asm/bitsperlong.h" #include "../../arch/s390/include/uapi/asm/bitsperlong.h" #include "../../arch/sparc/include/uapi/asm/bitsperlong.h" #include "../../arch/mips/include/uapi/asm/bitsperlong.h" #include "../../arch/ia64/include/uapi/asm/bitsperlong.h" #include "../../arch/riscv/include/uapi/asm/bitsperlong.h" #include "../../arch/alpha/include/uapi/asm/bitsperlong.h" #include <asm-generic/bitsperlong.h> $ ls -la ../../arch/x86/include/uapi/asm/bitsperlong.h ls: cannot access '../../arch/x86/include/uapi/asm/bitsperlong.h': No such file or directory $ ls -la ../../../arch/*/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 237 ../../../arch/alpha/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 841 ../../../arch/arm64/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 966 ../../../arch/hexagon/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 234 ../../../arch/ia64/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 100 ../../../arch/microblaze/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 244 ../../../arch/mips/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 352 ../../../arch/parisc/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 312 ../../../arch/powerpc/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 353 ../../../arch/riscv/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 292 ../../../arch/s390/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 323 ../../../arch/sparc/include/uapi/asm/bitsperlong.h -rw-rw-r--. 1 320 ../../../arch/x86/include/uapi/asm/bitsperlong.h $
Found while fixing some other problem, before it was escaping the tools/ chroot and using stuff in the kernel sources:
CC /tmp/build/perf/util/find_bit.o
In file included from /git/linux/tools/include/../../arch/x86/include/uapi/asm/bitsperlong.h:11,
from /git/linux/tools/include/uapi/asm/bitsperlong.h:3,
from /git/linux/tools/include/linux/bits.h:6,
from /git/linux/tools/include/linux/bitops.h:13,
from ../lib/find_bit.c:17:# cd /git/linux/tools/include/../../arch/x86/include/uapi/asm/ # pwd /git/linux/arch/x86/include/uapi/asm #
Now it is getting the one we want it to, i.e. the one inside tools/:
CC /tmp/build/perf/util/find_bit.o
In file included from /git/linux/tools/arch/x86/include/uapi/asm/bitsperlong.h:11,
from /git/linux/tools/include/linux/bits.h:6,
from /git/linux/tools/include/linux/bitops.h:13,
--- tools/include/uapi/asm/bitsperlong.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
tools/include/uapi/asm/bitsperlong.h +9 -9
@@ -1,22 +1,22 @@/* SPDX-License-Identifier: GPL-2.0 */ #if defined(__i386__) || defined(__x86_64__) -#include "../../arch/x86/include/uapi/asm/bitsperlong.h" +#include "../../../arch/x86/include/uapi/asm/bitsperlong.h" #elif defined(__aarch64__) -#include "../../arch/arm64/include/uapi/asm/bitsperlong.h" +#include "../../../arch/arm64/include/uapi/asm/bitsperlong.h" #elif defined(__powerpc__) -#include "../../arch/powerpc/include/uapi/asm/bitsperlong.h" +#include "../../../arch/powerpc/include/uapi/asm/bitsperlong.h" #elif defined(__s390__) -#include "../../arch/s390/include/uapi/asm/bitsperlong.h" +#include "../../../arch/s390/include/uapi/asm/bitsperlong.h" #elif defined(__sparc__) -#include "../../arch/sparc/include/uapi/asm/bitsperlong.h" +#include "../../../arch/sparc/include/uapi/asm/bitsperlong.h" #elif defined(__mips__) -#include "../../arch/mips/include/uapi/asm/bitsperlong.h" +#include "../../../arch/mips/include/uapi/asm/bitsperlong.h" #elif defined(__ia64__) -#include "../../arch/ia64/include/uapi/asm/bitsperlong.h" +#include "../../../arch/ia64/include/uapi/asm/bitsperlong.h" #elif defined(__riscv) -#include "../../arch/riscv/include/uapi/asm/bitsperlong.h" +#include "../../../arch/riscv/include/uapi/asm/bitsperlong.h" #elif defined(__alpha__) -#include "../../arch/alpha/include/uapi/asm/bitsperlong.h" +#include "../../../arch/alpha/include/uapi/asm/bitsperlong.h" #else #include <asm-generic/bitsperlong.h> #endif
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 132/344 ASoC: sun4i-i2s: Dont use the oversample to calculate BCLK
In reply to Greg Kroah-HartmanFrom: Maxime Ripard <[email protected]>
[ Upstream commit 7df8f9a20196072162d9dc8fe99943f2d35f23d5 ]
The BCLK divider should be calculated using the parameters that actually make the BCLK rate: the number of channels, the sampling rate and the sample width.
We've been using the oversample_rate previously because in the former SoCs, the BCLK's parent is MCLK, which in turn is being used to generate the oversample rate, so we end up with something like this:
oversample = mclk_rate / sampling_ratebclk_div = oversample / word_size / channels
So, bclk_div = mclk_rate / sampling_rate / word_size / channels.
And this is actually better, since the oversampling ratio only plays a role because the MCLK is its parent, not because of what BCLK is supposed to be.
Furthermore, that assumption of MCLK being the parent has been broken on newer SoCs, so let's use the proper formula, and have the parent rate as an argument.
--- sound/soc/sunxi/sun4i-i2s.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
sound/soc/sunxi/sun4i-i2s.c +5 -4
@@ -222,10 +222,11 @@ static const struct sun4i_i2s_clk_div sun4i_i2s_mclk_div[] = { };static int sun4i_i2s_get_bclk_div (struct sun4i_i2s *i2s, -unsigned int oversample_rate, +unsigned long parent_rate, +unsigned int sampling_rate,unsigned int word_size) { -int div = oversample_rate / word_size /2 ; +int div = parent_rate / sampling_rate / word_size /2 ;int i;for (i =0 ; i <ARRAY_SIZE (sun4i_i2s_bclk_div); i++) {
@@ -315,8 +316,8 @@ static int sun4i_i2s_set_clk_rate(struct snd_soc_dai *dai,return -EINVAL ; } - bclk_div =sun4i_i2s_get_bclk_div (i2s, oversample_rate, - word_size); + bclk_div =sun4i_i2s_get_bclk_div (i2s, i2s->mclk_freq, + rate, word_size);if (bclk_div <0 ) {dev_err (dai->dev,"Unsupported BCLK divider: %d\n" , bclk_div);return -EINVAL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 133/344 ASoC: mchp-i2s-mcc: Wait for RX/TX RDY only if controller is running
In reply to Greg Kroah-HartmanFrom: Codrin Ciubotariu <[email protected]>
[ Upstream commit 0f6fc97501b790c971b11b52a654009d21c45238 ]
Since hw_free() can be called multiple times and not just after a stop trigger command, we should check whether the RX or TX ready interrupt was truly enabled previously. For this, we assure that the condition of the wait event is always true, except when RX/TX interrupts are enabled.
--- sound/soc/atmel/mchp-i2s-mcc.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
sound/soc/atmel/mchp-i2s-mcc.c +16 -12
@@ -686,22 +686,24 @@ static int mchp_i2s_mcc_hw_free(struct snd_pcm_substream *substream, err =wait_event_interruptible_timeout (dev->wq_txrdy, dev->tx_rdy,msecs_to_jiffies (500 )); +if (err ==0 ) { +dev_warn_once (dev->dev, +"Timeout waiting for Tx ready\n" ); +regmap_write (dev->regmap,MCHP_I2SMCC_IDRA , +MCHP_I2SMCC_INT_TXRDY_MASK (dev->channels)); + dev->tx_rdy =1 ; + } }else { err =wait_event_interruptible_timeout (dev->wq_rxrdy, dev->rx_rdy,msecs_to_jiffies (500 )); - } - -if (err ==0 ) { -u32 idra; - -dev_warn_once (dev->dev,"Timeout waiting for %s\n" , - is_playback ?"Tx ready" :"Rx ready" ); -if (is_playback) - idra =MCHP_I2SMCC_INT_TXRDY_MASK (dev->channels); -else - idra =MCHP_I2SMCC_INT_RXRDY_MASK (dev->channels); -regmap_write (dev->regmap,MCHP_I2SMCC_IDRA , idra); +if (err ==0 ) { +dev_warn_once (dev->dev, +"Timeout waiting for Rx ready\n" ); +regmap_write (dev->regmap,MCHP_I2SMCC_IDRA , +MCHP_I2SMCC_INT_RXRDY_MASK (dev->channels)); + dev->rx_rdy =1 ; + } }if (!mchp_i2s_mcc_is_running (dev)) {
@@ -809,6 +811,8 @@ static int mchp_i2s_mcc_dai_probe(struct snd_soc_dai *dai)init_waitqueue_head (&dev->wq_txrdy);init_waitqueue_head (&dev->wq_rxrdy); + dev->tx_rdy =1 ; + dev->rx_rdy =1 ;snd_soc_dai_init_dma_data (dai, &dev->playback, &dev->capture);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 134/344 led: triggers: Fix a memory leak bug
In reply to Greg Kroah-HartmanFrom: Wenwen Wang <[email protected]>
[ Upstream commit 60e2dde1e91ae0addb21ac380cc36ebee7534e49 ]
In led_trigger_set(), 'event' is allocated in kasprintf(). However, it is not deallocated in the following execution if the label 'err_activate' or 'err_add_groups' is entered, leading to memory leaks. To fix this issue, free 'event' before returning the error.
--- drivers/leds/led-triggers.c | 1 + 1 file changed, 1 insertion(+)
drivers/leds/led-triggers.c +1 -0
@@ -173,6 +173,7 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig)list_del (&led_cdev->trig_list);write_unlock_irqrestore (&led_cdev->trigger->leddev_list_lock, flags);led_set_brightness (led_cdev,LED_OFF ); +kfree (event);return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 135/344 ASoC: mchp-i2s-mcc: Fix unprepare of GCLK
In reply to Greg Kroah-HartmanFrom: Codrin Ciubotariu <[email protected]>
[ Upstream commit 988b59467b2b14523a266957affbe9eca3e99fc9 ]
If hw_free() gets called after hw_params(), GCLK remains prepared, preventing further use of it. This patch fixes this by unpreparing the clock in hw_free() or if hw_params() gets an error.
--- sound/soc/atmel/mchp-i2s-mcc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
sound/soc/atmel/mchp-i2s-mcc.c +11 -2
@@ -670,8 +670,13 @@ static int mchp_i2s_mcc_hw_params(struct snd_pcm_substream *substream, } ret =regmap_write (dev->regmap,MCHP_I2SMCC_MRA , mra); -if (ret <0 ) +if (ret <0 ) { +if (dev->gclk_use) { +clk_unprepare (dev->gclk); + dev->gclk_use =0 ; + }return ret; + }return regmap_write (dev->regmap,MCHP_I2SMCC_MRB , mrb); }
@@ -710,9 +715,13 @@ static int mchp_i2s_mcc_hw_free(struct snd_pcm_substream *substream,regmap_write (dev->regmap,MCHP_I2SMCC_CR ,MCHP_I2SMCC_CR_CKDIS );if (dev->gclk_running) { -clk_disable_unprepare (dev->gclk); +clk_disable (dev->gclk); dev->gclk_running =0 ; } +if (dev->gclk_use) { +clk_unprepare (dev->gclk); + dev->gclk_use =0 ; + } }return 0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 136/344 nbd: add missing config put
In reply to Greg Kroah-HartmanFrom: Mike Christie <[email protected]>
[ Upstream commit 887e975c4172d0d5670c39ead2f18ba1e4ec8133 ]
Fix bug added with the patch:
commit 8f3ea35929a0806ad1397db99a89ffee0140822a
Author: Josef Bacik <[email protected]> Date: Mon Jul 16 12:11:35 2018 -0400
nbd: handle unexpected replies better
where if the timeout handler runs when the completion path is and we fail to grab the mutex in the timeout handler we will leave a config reference and cannot free the config later.
--- drivers/block/nbd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/block/nbd.c +3 -1
@@ -357,8 +357,10 @@ static enum blk_eh_timer_return nbd_xmit_timeout(struct request *req, } config = nbd->config; -if (!mutex_trylock (&cmd->lock)) +if (!mutex_trylock (&cmd->lock)) { +nbd_config_put (nbd);return BLK_EH_RESET_TIMER ; + }if (config->num_connections >1 ) { dev_err_ratelimited(nbd_to_dev(nbd),
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 137/344 ACPI / APEI: Release resources if gen_pool_add() fails
In reply to Greg Kroah-HartmanFrom: Liguang Zhang <[email protected]>
[ Upstream commit 6abc7622271dc520f241462e2474c71723638851 ]
Destroy ghes_estatus_pool and release memory allocated via vmalloc() on errors in ghes_estatus_pool_init() in order to avoid memory leaks.
[ bp: do the labels properly and with descriptive names and massage. ]
--- drivers/acpi/apei/ghes.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
drivers/acpi/apei/ghes.c +15 -2
@@ -153,6 +153,7 @@ static void ghes_unmap(void __iomem *vaddr, enum fixed_addresses fixmap_idx)int ghes_estatus_pool_init (int num_ghes) {unsigned long addr, len; +int rc; ghes_estatus_pool =gen_pool_create (GHES_ESTATUS_POOL_MIN_ALLOC_ORDER ,-1 );if (!ghes_estatus_pool)
@@ -164,7 +165,7 @@ int ghes_estatus_pool_init(int num_ghes) ghes_estatus_pool_size_request =PAGE_ALIGN (len); addr = (unsigned long )vmalloc (PAGE_ALIGN (len));if (!addr) -return -ENOMEM ; + goto err_pool_alloc;/* * New allocation must be visible in all pgd before it can be found by
@@ -172,7 +173,19 @@ int ghes_estatus_pool_init(int num_ghes)*/ vmalloc_sync_all (); -return gen_pool_add (ghes_estatus_pool, addr,PAGE_ALIGN (len),-1 ); + rc =gen_pool_add (ghes_estatus_pool, addr,PAGE_ALIGN (len),-1 ); +if (rc) + goto err_pool_add; + +return 0 ; + +err_pool_add: +vfree ((void *)addr); + +err_pool_alloc: +gen_pool_destroy (ghes_estatus_pool); + +return -ENOMEM ; }static int map_gen_v2 (struct ghes *ghes)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 138/344 arm64: entry: Move ct_user_exit before any other exception
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
[ Upstream commit 2671828c3ff4ffadf777f793a1f3232d6e51394a ]
When taking an SError or Debug exception from EL0, we run the C handler for these exceptions before updating the context tracking code and unmasking lower priority interrupts.
When booting with nohz_full lockdep tells us we got this wrong:
| =============================
| WARNING: suspicious RCU usage
| 5.3.0-rc2-00010-gb4b5e9dcb11b-dirty #11271 Not tainted
| -----------------------------
| include/linux/rcupdate.h:643 rcu_read_unlock() used illegally wh!
|
| other info that might help us debug this:
|
|
| RCU used illegally from idle CPU!
| rcu_scheduler_active = 2, debug_locks = 1
| RCU used illegally from extended quiescent state!
| 1 lock held by a.out/432:
| #0: 00000000c7a79515 (rcu_read_lock){....}, at: brk_handler+0x00
|
| stack backtrace:
| CPU: 1 PID: 432 Comm: a.out Not tainted 5.3.0-rc2-00010-gb4b5e9d1
| Hardware name: ARM LTD ARM Juno Development Platform/ARM Juno De8
| Call trace:
| dump_backtrace+0x0/0x140
| show_stack+0x14/0x20
| dump_stack+0xbc/0x104
| lockdep_rcu_suspicious+0xf8/0x108
| brk_handler+0x164/0x1b0
| do_debug_exception+0x11c/0x278
| el0_dbg+0x14/0x20Moving the ct_user_exit calls to be before do_debug_exception() means they are also before trace_hardirqs_off() has been updated. Add a new ct_user_exit_irqoff macro to avoid the context-tracking code using irqsave/restore before we've updated trace_hardirqs_off(). To be consistent, do this everywhere.
The C helper is called enter_from_user_mode() to match x86 in the hope we can merge them into kernel/context_tracking.c later.
--- arch/arm64/include/asm/exception.h | 2 ++ arch/arm64/kernel/entry.S | 36 ++++++++++++++++-------------- arch/arm64/kernel/traps.c | 9 ++++++++ 3 files changed, 30 insertions(+), 17 deletions(-)
arch/arm64/include/asm/exception.h +2 -0
@@ -30,4 +30,6 @@ static inline u32 disr_to_esr(u64 disr)return esr; } +asmlinkage void enter_from_user_mode(void); +#endif /* __ASM_EXCEPTION_H */
arch/arm64/kernel/entry.S +19 -17
@@ -30,9 +30,9 @@ * Context tracking subsystem. Used to instrument transitions * between user and kernel mode. */ - .macro ct_user_exit + .macro ct_user_exit_irqoff #ifdef CONFIG_CONTEXT_TRACKING - bl context_tracking_user_exit + bl enter_from_user_mode #endif .endm
@@ -792,8 +792,8 @@ el0_cp15: /* * Trapped CP15 (MRC, MCR, MRRC, MCRR) instructions */ + ct_user_exit_irqoff enable_daif - ct_user_exit mov x0, x25 mov x1, sp bl do_cp15instr
@@ -805,8 +805,8 @@ el0_da: * Data abort handling */ mrs x26, far_el1 + ct_user_exit_irqoff enable_daif - ct_user_exit clear_address_tag x0, x26 mov x1, x25 mov x2, sp
@@ -818,11 +818,11 @@ el0_ia: */ mrs x26, far_el1 gic_prio_kentry_setup tmp=x0 + ct_user_exit_irqoff enable_da_f #ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_off #endif - ct_user_exit mov x0, x26 mov x1, x25 mov x2, sp
@@ -832,8 +832,8 @@ el0_fpsimd_acc: /* * Floating Point or Advanced SIMD access */ + ct_user_exit_irqoff enable_daif - ct_user_exit mov x0, x25 mov x1, sp bl do_fpsimd_acc
@@ -842,8 +842,8 @@ el0_sve_acc: /* * Scalable Vector Extension access */ + ct_user_exit_irqoff enable_daif - ct_user_exit mov x0, x25 mov x1, sp bl do_sve_acc
@@ -852,8 +852,8 @@ el0_fpsimd_exc: /* * Floating Point, Advanced SIMD or SVE exception */ + ct_user_exit_irqoff enable_daif - ct_user_exit mov x0, x25 mov x1, sp bl do_fpsimd_exc
@@ -868,11 +868,11 @@ el0_sp_pc: * Stack or PC alignment exception handling */ gic_prio_kentry_setup tmp=x0 + ct_user_exit_irqoff enable_da_f #ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_off #endif - ct_user_exit mov x0, x26 mov x1, x25 mov x2, sp
@@ -882,8 +882,8 @@ el0_undef: /* * Undefined instruction */ + ct_user_exit_irqoff enable_daif - ct_user_exit mov x0, sp bl do_undefinstr b ret_to_user
@@ -891,8 +891,8 @@ el0_sys: /* * System instructions, for trapped cache maintenance instructions */ + ct_user_exit_irqoff enable_daif - ct_user_exit mov x0, x25 mov x1, sp bl do_sysinstr
@@ -902,17 +902,18 @@ el0_dbg: * Debug exception handling */ tbnz x24, #0, el0_inv // EL0 only + mrs x24, far_el1 gic_prio_kentry_setup tmp=x3 - mrs x0, far_el1 + ct_user_exit_irqoff + mov x0, x24 mov x1, x25 mov x2, sp bl do_debug_exception enable_da_f - ct_user_exit b ret_to_user el0_inv: + ct_user_exit_irqoff enable_daif - ct_user_exit mov x0, sp mov x1, #BAD_SYNC mov x2, x25
@@ -925,13 +926,13 @@ el0_irq: kernel_entry 0 el0_irq_naked: gic_prio_irq_setup pmr=x20, tmp=x0 + ct_user_exit_irqoff enable_da_f #ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_off #endif - ct_user_exit #ifdef CONFIG_HARDEN_BRANCH_PREDICTOR tbz x22, #55, 1f bl do_el0_irq_bp_hardening
@@ -958,13 +959,14 @@ ENDPROC(el1_error) el0_error: kernel_entry 0 el0_error_naked: - mrs x1, esr_el1 + mrs x25, esr_el1 gic_prio_kentry_setup tmp=x2 + ct_user_exit_irqoff enable_dbg mov x0, sp + mov x1, x25 bl do_serror enable_da_f - ct_user_exit b ret_to_user ENDPROC(el0_error)
arch/arm64/kernel/traps.c +9 -0
@@ -7,9 +7,11 @@*/ #include <linux/bug.h> +#include <linux/context_tracking.h> #include <linux/signal.h> #include <linux/personality.h> #include <linux/kallsyms.h> +#include <linux/kprobes.h> #include <linux/spinlock.h> #include <linux/uaccess.h> #include <linux/hardirq.h>
@@ -900,6 +902,13 @@ asmlinkage void do_serror(struct pt_regs *regs, unsigned int esr)nmi_exit (); } +asmlinkage void enter_from_user_mode(void) +{ +CT_WARN_ON (ct_state () !=CONTEXT_USER ); +user_exit_irqoff (); +} +NOKPROBE_SYMBOL (enter_from_user_mode); +void __pte_error (const char *file,int line,unsigned long val) {pr_err ("%s:%d: bad pte %016lx.\n" , file, line, val);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 139/344 s390/kasan: provide uninstrumented __strlen
In reply to Greg Kroah-HartmanFrom: Vasily Gorbik <[email protected]>
[ Upstream commit f45f7b5bdaa4828ce871cf03f7c01599a0de57a5 ]
s390 kasan code uses sclp_early_printk to report initialization failures. The code doing that should not be instrumented, because kasan shadow memory has not been set up yet. Even though sclp_early_core.c is compiled with instrumentation disabled it uses strlen function, which is instrumented and would produce shadow memory access if used. To avoid that, introduce uninstrumented __strlen function to be used instead.
Before commit 7e0d92f00246 ("s390/kasan: improve string/memory functions checks") few string functions (including strlen) were escaping kasan instrumentation due to usage of platform specific versions which are implemented in inline assembly.
--- arch/s390/include/asm/string.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
arch/s390/include/asm/string.h +7 -2
@@ -71,11 +71,16 @@ extern void *__memmove(void *dest, const void *src, size_t n);#define memcpy (dst, src, len) __memcpy(dst, src, len)#define memmove (dst, src, len) __memmove(dst, src, len)#define memset (s, c, n) __memset(s, c, n) +#define strlen (s) __strlen(s) + +#define __no_sanitize_prefix_strfunc (x) __##x#ifndef __NO_FORTIFY#define __NO_FORTIFY/* FORTIFY_SOURCE uses __builtin_memcpy, etc. */ #endif +#else +#define __no_sanitize_prefix_strfunc (x) x#endif /* defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__) */ void *__memset16 (uint16_t *s,uint16_t v,size_t count);
@@ -163,8 +168,8 @@ static inline char *strcpy(char *dst, const char *src) }#endif -#ifdef __HAVE_ARCH_STRLEN -static inline size_t strlen (const char *s) +#if defined(__HAVE_ARCH_STRLEN) || (defined(CONFIG_KASAN ) && !defined(__SANITIZE_ADDRESS__)) +static inline size_t __no_sanitize_prefix_strfunc (strlen )(const char *s) { register unsigned long r0 asm("0") = 0;const char *tmp = s;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 140/344 media: mceusb: fix (eliminate) TX IR signal length limit
In reply to Greg Kroah-HartmanFrom: A Sun <[email protected]>
[ Upstream commit 9fc3ce31f5bde660197f35135e90a1cced58aa2c ]
Fix and eliminate mceusb's IR length limit for IR signals transmitted to the MCE IR blaster ports.
An IR signal TX exceeding 306 pulse/space samples presently causes -EINVAL return error. There's no such limitation nor error with the MCE device hardware. And valid IR signals exist with more than 400 pulse/space for the control of certain appliances (eg Panasonic ACXA75C00600 air conditioner).
The scope of this patch is limited to the mceusb driver. There are still IR signal TX length and time constraints that related modules of rc core (eg LIRC) impose, further up the driver stack.
Changes for mceusb_tx_ir():
Converts and sends LIRC IR pulse/space sequence to MCE device IR pulse/space format.
Break long length LIRC sequence into multiple (unlimited number of) parts for sending to the MCE device.
Reduce kernel stack IR buffer size: 128 (was 384)
Increase MCE IR data packet size: 31 (was 5)
Zero time LIRC pulse/space no longer copied to MCE IR data. Eliminate overwriting the source/input LIRC IR data in txbuf[]. Eliminate -EINVAL return; return number of IR samples sent (>0) or MCE write error code (<0).
New mce_write() and mce_write_callback():
Implements synchronous blocking I/O, with timeout, for writing/sending data to the MCE device.
An unlimited multipart IR signal sent to the MCE device faster than real time requires flow control absent with the original mce_request_packet() and mce_async_callback() asynchronous I/O implementation. Also absent is TX error feedback.
mce_write() combines and replaces mce_request_packet() and mce_async_callback() with conversion to synchronous I/O. mce_write() returns bytes sent (>0) or MCE device write error (<0). Debug hex dump TX data before processing.
Rename mce_async_out() -> mce_command_out():
The original name is misleading with underlying synchronous I/O implementation. Function renamed to mce_command_out().
Changes in mceusb_handle_command():
Add support for MCE device error case MCE_RSP_TX_TIMEOUT "IR TX timeout (TX buffer underrun)"
Changes in mceusb_dev_printdata():
Changes support test and debug of multipart TX IR.
Add buffer boundary information (offset and buffer size) to TX hex dump. Correct TX trace bug "Raw IR data, 0 pulse/space samples" Add trace for MCE_RSP_TX_TIMEOUT "IR TX timeout (TX buffer underrun)"
Other changes:
The driver's write to USB device architecture change (async to sync I/O) is significant so we bump DRIVER_VERSION to "1.95" (from "1.94").
Tests:
$ cat -n irdata1 | head -3
1 carrier 36000
2 pulse 6350
3 space 6350
$ cat -n irdata1 | tail -3
76 pulse 6350
77 space 6350
78 pulse 6350
$ ir-ctl -s irdata1[1549021.073612] mceusb 1-1.3:1.0: requesting 36000 HZ carrier [1549021.073635] mceusb 1-1.3:1.0: tx data[0]: 9f 06 01 45 (len=4 sz=4) [1549021.073649] mceusb 1-1.3:1.0: Request carrier of 35714 Hz (period 28us) [1549021.073848] mceusb 1-1.3:1.0: tx done status = 4 (wait = 100, expire = 100 (1000ms), urb->actual_length = 4, urb->status = 0) [1549021.074689] mceusb 1-1.3:1.0: rx data[0]: 9f 06 01 45 (len=4 sz=4) [1549021.074701] mceusb 1-1.3:1.0: Got carrier of 35714 Hz (period 28us) [1549021.102023] mceusb 1-1.3:1.0: tx data[0]: 9f 08 03 (len=3 sz=3) [1549021.102036] mceusb 1-1.3:1.0: Request transmit blaster mask of 0x03 [1549021.102219] mceusb 1-1.3:1.0: tx done status = 3 (wait = 100, expire = 100 (1000ms), urb->actual_length = 3, urb->status = 0) [1549021.131979] mceusb 1-1.3:1.0: tx data[0]: 9e ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f 9e ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f 91 ff (len=81 sz=81) [1549021.131992] mceusb 1-1.3:1.0: Raw IR data, 30 pulse/space samples [1549021.133592] mceusb 1-1.3:1.0: tx done status = 81 (wait = 100, expire = 100 (1000ms), urb->actual_length = 81, urb->status = 0)
Hex dumps limited to 64 bytes.0xff is MCE maximum time pulse, 0x7f is MCE maximum time space.
$ cat -n irdata2 | head -3
1 carrier 36000
2 pulse 50
3 space 50
$ cat -n irdata2 | tail -3
254 pulse 50
255 space 50
256 pulse 50
$ ir-ctl -s irdata2[1549306.586998] mceusb 1-1.3:1.0: tx data[0]: 9f 08 03 (len=3 sz=3) [1549306.587015] mceusb 1-1.3:1.0: Request transmit blaster mask of 0x03 [1549306.587252] mceusb 1-1.3:1.0: tx done status = 3 (wait = 100, expire = 100 (1000ms), urb->actual_length = 3, urb->status = 0) [1549306.613275] mceusb 1-1.3:1.0: tx data[0]: 9e 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 9e 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 9e 81 (len=128 sz=128) [1549306.613291] mceusb 1-1.3:1.0: Raw IR data, 30 pulse/space samples [1549306.614837] mceusb 1-1.3:1.0: tx done status = 128 (wait = 100, expire = 100 (1000ms), urb->actual_length = 128, urb->status = 0) [1549306.614861] mceusb 1-1.3:1.0: tx data[0]: 9e 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 9e 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 01 81 9e 01 (len=128 sz=128) [1549306.614869] mceusb 1-1.3:1.0: Raw IR data, 30 pulse/space samples [1549306.620199] mceusb 1-1.3:1.0: tx done status = 128 (wait = 100, expire = 100 (1000ms), urb->actual_length = 128, urb->status = 0) [1549306.620212] mceusb 1-1.3:1.0: tx data[0]: 89 81 01 81 01 81 01 81 01 81 80 (len=11 sz=11) [1549306.620221] mceusb 1-1.3:1.0: Raw IR data, 9 pulse/space samples [1549306.633294] mceusb 1-1.3:1.0: tx done status = 11 (wait = 98, expire = 100 (1000ms), urb->actual_length = 11, urb->status = 0)
Hex dumps limited to 64 bytes.0x81 is MCE minimum time pulse, 0x01 is MCE minimum time space. TX IR part 3 sz=11 shows 20msec I/O blocking delay (100expire - 98wait = 2jiffies)
--- drivers/media/rc/mceusb.c | 334 ++++++++++++++++++++++---------------- 1 file changed, 196 insertions(+), 138 deletions(-)
drivers/media/rc/mceusb.c +196 -138
@@ -31,21 +31,22 @@#include <linux/pm_wakeup.h> #include <media/rc-core.h> -#define DRIVER_VERSION "1.94" +#define DRIVER_VERSION "1.95"#define DRIVER_AUTHOR "Jarod Wilson <[email protected]>"#define DRIVER_DESC "Windows Media Center Ed. eHome Infrared Transceiver " \ "device driver"#define DRIVER_NAME "mceusb" +#define USB_TX_TIMEOUT 1000/* in milliseconds */ #define USB_CTRL_MSG_SZ 2/* Size of usb ctrl msg on gen1 hw */ #define MCE_G1_INIT_MSGS 40/* Init messages on gen1 hw to throw out */ /* MCE constants */ -#define MCE_CMDBUF_SIZE 384/* MCE Command buffer length */ +#define MCE_IRBUF_SIZE 128/* TX IR buffer length */ #define MCE_TIME_UNIT 50/* Approx 50us resolution */ -#define MCE_CODE_LENGTH 5/* Normal length of packet (with header) */ -#define MCE_PACKET_SIZE 4/* Normal length of packet (without header) */ -#define MCE_IRDATA_HEADER 0x84/* Actual header format is 0x80 + num_bytes */ +#define MCE_PACKET_SIZE 31/* Max length of packet (with header) */ +#define MCE_IRDATA_HEADER (0x80 + MCE_PACKET_SIZE - 1) +/* Actual format is 0x80 + num_bytes */ #define MCE_IRDATA_TRAILER 0x80/* End of IR data */ #define MCE_MAX_CHANNELS 2/* Two transmitters, hardware dependent? */ #define MCE_DEFAULT_TX_MASK 0x03/* Vals: TX1=0x01, TX2=0x02, ALL=0x03 */
@@ -607,9 +608,9 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, u8 *buf, int buf_len,if (len <= skip)return ; -dev_dbg (dev,"%cx data: %*ph (length=%d)" , - (out ?'t' :'r' ), -min (len, buf_len - offset), buf + offset, len); +dev_dbg (dev,"%cx data[%d]: %*ph (len=%d sz=%d)" , + (out ?'t' :'r' ), offset, +min (len, buf_len - offset), buf + offset, len, buf_len); inout = out ?"Request" :"Got" ;
@@ -731,6 +732,9 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, u8 *buf, int buf_len,case MCE_RSP_CMD_ILLEGAL :dev_dbg (dev,"Illegal PORT_IR command" );break ; +case MCE_RSP_TX_TIMEOUT : +dev_dbg (dev,"IR TX timeout (TX buffer underrun)" ); +break ;default :dev_dbg (dev,"Unknown command 0x%02x 0x%02x" , cmd, subcmd);
@@ -745,13 +749,14 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, u8 *buf, int buf_len, dev_dbg(dev, "End of raw IR data"); else if ((cmd != MCE_CMD_PORT_IR) && ((cmd & MCE_PORT_MASK) == MCE_COMMAND_IRDATA)) - dev_dbg(dev, "Raw IR data, %d pulse/space samples", ir->rem); + dev_dbg(dev, "Raw IR data, %d pulse/space samples", + cmd & MCE_PACKET_LENGTH_MASK);#endif }/* * Schedule work that can't be done in interrupt handlers -* (mceusb_dev_recv() and mce_async_callback()) nor tasklets. +* (mceusb_dev_recv() and mce_write_callback()) nor tasklets. * Invokes mceusb_deferred_kevent() for recovering from * error events specified by the kevent bit field. */
@@ -764,23 +769,80 @@ static void mceusb_defer_kevent(struct mceusb_dev *ir, int kevent)dev_dbg (ir->dev,"kevent %d scheduled" , kevent); } -static void mce_async_callback (struct urb *urb) +static void mce_write_callback (struct urb *urb) { -struct mceusb_dev *ir; -int len; -if (!urb)return ; - ir = urb->context; +complete (urb->context); +} + +/* +* Write (TX/send) data to MCE device USB endpoint out. +* Used for IR blaster TX and MCE device commands. +* +* Return: The number of bytes written (> 0) or errno (< 0). +*/ +static int mce_write (struct mceusb_dev *ir,u8 *data,int size) +{ +int ret; +struct urb *urb; +struct device *dev = ir->dev; +unsigned char *buf_out; +struct completion tx_done; +unsigned long expire; +unsigned long ret_wait; + +mceusb_dev_printdata (ir, data, size,0 , size, true); + + urb =usb_alloc_urb (0 ,GFP_KERNEL ); +if (unlikely (!urb)) { +dev_err (dev,"Error: mce write couldn't allocate urb" ); +return -ENOMEM ; + } + + buf_out =kmalloc (size,GFP_KERNEL ); +if (!buf_out) { +usb_free_urb (urb); +return -ENOMEM ; + } + +init_completion (&tx_done); + +/* outbound data */ +if (usb_endpoint_xfer_int (ir->usb_ep_out)) +usb_fill_int_urb (urb, ir->usbdev, ir->pipe_out, + buf_out, size, mce_write_callback, &tx_done, + ir->usb_ep_out->bInterval); +else +usb_fill_bulk_urb (urb, ir->usbdev, ir->pipe_out, + buf_out, size, mce_write_callback, &tx_done); +memcpy (buf_out, data, size); + + ret =usb_submit_urb (urb,GFP_KERNEL ); +if (ret) { +dev_err (dev,"Error: mce write submit urb error = %d" , ret); +kfree (buf_out); +usb_free_urb (urb); +return ret; + } + + expire =msecs_to_jiffies (USB_TX_TIMEOUT ); + ret_wait =wait_for_completion_timeout (&tx_done, expire); +if (!ret_wait) { +dev_err (dev,"Error: mce write timed out (expire = %lu (%dms))" , + expire,USB_TX_TIMEOUT ); +usb_kill_urb (urb); + ret = (urb->status == -ENOENT ? -ETIMEDOUT : urb->status); + }else { + ret = urb->status; + } +if (ret >=0 ) + ret = urb->actual_length;/* bytes written */ switch (urb->status) {/* success */ case 0 : - len = urb->actual_length; - -mceusb_dev_printdata (ir, urb->transfer_buffer, len, -0 , len, true);break ;case -ECONNRESET :
@@ -790,140 +852,135 @@ static void mce_async_callback(struct urb *urb)break ;case -EPIPE : -dev_err (ir->dev,"Error: request urb status = %d (TX HALT)" , +dev_err (ir->dev,"Error: mce write urb status = %d (TX HALT)" , urb->status);mceusb_defer_kevent (ir,EVENT_TX_HALT );break ;default : -dev_err (ir->dev,"Error: request urb status = %d" , urb->status); +dev_err (ir->dev,"Error: mce write urb status = %d" , + urb->status);break ; } -/* the transfer buffer and urb were allocated in mce_request_packet */ -kfree (urb->transfer_buffer); -usb_free_urb (urb); -} - -/* request outgoing (send) usb packet - used to initialize remote */ -static void mce_request_packet (struct mceusb_dev *ir,unsigned char *data, -int size) -{ -int res; -struct urb *async_urb; -struct device *dev = ir->dev; -unsigned char *async_buf; +dev_dbg (dev,"tx done status = %d (wait = %lu, expire = %lu (%dms), urb->actual_length = %d, urb->status = %d)" , + ret, ret_wait, expire,USB_TX_TIMEOUT , + urb->actual_length, urb->status); - async_urb =usb_alloc_urb (0 ,GFP_KERNEL ); -if (unlikely (!async_urb)) { -dev_err (dev,"Error, couldn't allocate urb!" ); -return ; - } - - async_buf =kmalloc (size,GFP_KERNEL ); -if (!async_buf) { -usb_free_urb (async_urb); -return ; - } - -/* outbound data */ -if (usb_endpoint_xfer_int (ir->usb_ep_out)) -usb_fill_int_urb (async_urb, ir->usbdev, ir->pipe_out, - async_buf, size, mce_async_callback, ir, - ir->usb_ep_out->bInterval); -else -usb_fill_bulk_urb (async_urb, ir->usbdev, ir->pipe_out, - async_buf, size, mce_async_callback, ir); - -memcpy (async_buf, data, size); - -dev_dbg (dev,"send request called (size=%#x)" , size); +kfree (buf_out); +usb_free_urb (urb); - res =usb_submit_urb (async_urb,GFP_ATOMIC ); -if (res) { -dev_err (dev,"send request FAILED! (res=%d)" , res); -kfree (async_buf); -usb_free_urb (async_urb); -return ; - } -dev_dbg (dev,"send request complete (res=%d)" , res); +return ret; } -static void mce_async_out (struct mceusb_dev *ir,unsigned char *data,int size) +static void mce_command_out (struct mceusb_dev *ir,u8 *data,int size) {int rsize =sizeof (DEVICE_RESUME );if (ir->need_reset) { ir->need_reset = false; -mce_request_packet (ir,DEVICE_RESUME , rsize); +mce_write (ir,DEVICE_RESUME , rsize);msleep (10 ); } -mce_request_packet (ir, data, size); +mce_write (ir, data, size);msleep (10 ); } -/* Send data out the IR blaster port(s) */ +/* +* Transmit IR out the MCE device IR blaster port(s). +* +* Convert IR pulse/space sequence from LIRC to MCE format. +* Break up a long IR sequence into multiple parts (MCE IR data packets). +* +* u32 txbuf[] consists of IR pulse, space, ..., and pulse times in usec. +* Pulses and spaces are implicit by their position. +* The first IR sample, txbuf[0], is always a pulse. +* +* u8 irbuf[] consists of multiple IR data packets for the MCE device. +* A packet is 1 u8 MCE_IRDATA_HEADER and up to 30 u8 IR samples. +* An IR sample is 1-bit pulse/space flag with 7-bit time +* in MCE time units (50usec). +* +* Return: The number of IR samples sent (> 0) or errno (< 0). +*/ static int mceusb_tx_ir (struct rc_dev *dev,unsigned *txbuf,unsigned count) {struct mceusb_dev *ir = dev->priv; -int i, length, ret =0 ; -int cmdcount =0 ; -unsigned char cmdbuf[MCE_CMDBUF_SIZE ]; - -/* MCE tx init header */ - cmdbuf[cmdcount++] =MCE_CMD_PORT_IR ; - cmdbuf[cmdcount++] =MCE_CMD_SETIRTXPORTS ; - cmdbuf[cmdcount++] = ir->tx_mask; +u8 cmdbuf[3 ] = {MCE_CMD_PORT_IR ,MCE_CMD_SETIRTXPORTS ,0x00 }; +u8 irbuf[MCE_IRBUF_SIZE ]; +int ircount =0 ; +unsigned int irsample; +int i, length, ret;/* Send the set TX ports command */ -mce_async_out (ir, cmdbuf, cmdcount); - cmdcount =0 ; - -/* Generate mce packet data */ -for (i =0 ; (i < count) && (cmdcount <MCE_CMDBUF_SIZE ); i++) { - txbuf[i] = txbuf[i] /MCE_TIME_UNIT ; - -do {/* loop to support long pulses/spaces > 127*50us=6.35ms */ - -/* Insert mce packet header every 4th entry */ -if ((cmdcount <MCE_CMDBUF_SIZE ) && - (cmdcount %MCE_CODE_LENGTH ) ==0 ) - cmdbuf[cmdcount++] =MCE_IRDATA_HEADER ; - -/* Insert mce packet data */ -if (cmdcount <MCE_CMDBUF_SIZE ) - cmdbuf[cmdcount++] = - (txbuf[i] <MCE_PULSE_BIT ? - txbuf[i] :MCE_MAX_PULSE_LENGTH ) | - (i &1 ?0x00 :MCE_PULSE_BIT ); -else { - ret = -EINVAL ; - goto out; + cmdbuf[2 ] = ir->tx_mask; +mce_command_out (ir, cmdbuf,sizeof (cmdbuf)); + +/* Generate mce IR data packet */ +for (i =0 ; i < count; i++) { + irsample = txbuf[i] /MCE_TIME_UNIT ; + +/* loop to support long pulses/spaces > 6350us (127*50us) */ +while (irsample >0 ) { +/* Insert IR header every 30th entry */ +if (ircount %MCE_PACKET_SIZE ==0 ) { +/* Room for IR header and one IR sample? */ +if (ircount >=MCE_IRBUF_SIZE -1 ) { +/* Send near full buffer */ + ret =mce_write (ir, irbuf, ircount); +if (ret <0 ) +return ret; + ircount =0 ; + } + irbuf[ircount++] =MCE_IRDATA_HEADER ; } - }while ((txbuf[i] >MCE_MAX_PULSE_LENGTH ) && - (txbuf[i] -=MCE_MAX_PULSE_LENGTH )); - } - -/* Check if we have room for the empty packet at the end */ -if (cmdcount >=MCE_CMDBUF_SIZE ) { - ret = -EINVAL ; - goto out; - } +/* Insert IR sample */ +if (irsample <=MCE_MAX_PULSE_LENGTH ) { + irbuf[ircount] = irsample; + irsample =0 ; + }else { + irbuf[ircount] =MCE_MAX_PULSE_LENGTH ; + irsample -=MCE_MAX_PULSE_LENGTH ; + } +/* +* Even i = IR pulse +* Odd i = IR space +*/ + irbuf[ircount] |= (i &1 ?0 :MCE_PULSE_BIT ); + ircount++; + +/* IR buffer full? */ +if (ircount >=MCE_IRBUF_SIZE ) { +/* Fix packet length in last header */ + length = ircount %MCE_PACKET_SIZE ; +if (length >0 ) + irbuf[ircount - length] -= +MCE_PACKET_SIZE - length; +/* Send full buffer */ + ret =mce_write (ir, irbuf, ircount); +if (ret <0 ) +return ret; + ircount =0 ; + } + } + }/* after for loop, 0 <= ircount < MCE_IRBUF_SIZE */ /* Fix packet length in last header */ - length = cmdcount %MCE_CODE_LENGTH ; - cmdbuf[cmdcount - length] -=MCE_CODE_LENGTH - length; + length = ircount %MCE_PACKET_SIZE ; +if (length >0 ) + irbuf[ircount - length] -=MCE_PACKET_SIZE - length; -/* All mce commands end with an empty packet (0x80) */ - cmdbuf[cmdcount++] =MCE_IRDATA_TRAILER ; +/* Append IR trailer (0x80) to final partial (or empty) IR buffer */ + irbuf[ircount++] =MCE_IRDATA_TRAILER ; -/* Transmit the command to the mce device */ -mce_async_out (ir, cmdbuf, cmdcount); +/* Send final buffer */ + ret =mce_write (ir, irbuf, ircount); +if (ret <0 ) +return ret; -out: -return ret ? ret : count; +return count; }/* Sets active IR outputs -- mce devices typically have two */
@@ -963,7 +1020,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier) cmdbuf[2 ] =MCE_CMD_SIG_END ; cmdbuf[3 ] =MCE_IRDATA_TRAILER ;dev_dbg (ir->dev,"disabling carrier modulation" ); -mce_async_out (ir, cmdbuf,sizeof (cmdbuf)); +mce_command_out (ir, cmdbuf,sizeof (cmdbuf));return 0 ; }
@@ -977,7 +1034,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier) carrier);/* Transmit new carrier to mce device */ -mce_async_out (ir, cmdbuf,sizeof (cmdbuf)); +mce_command_out (ir, cmdbuf,sizeof (cmdbuf));return 0 ; } }
@@ -1000,10 +1057,10 @@ static int mceusb_set_timeout(struct rc_dev *dev, unsigned int timeout) cmdbuf[2 ] = units >>8 ; cmdbuf[3 ] = units; -mce_async_out (ir, cmdbuf,sizeof (cmdbuf)); +mce_command_out (ir, cmdbuf,sizeof (cmdbuf));/* get receiver timeout value */ -mce_async_out (ir,GET_RX_TIMEOUT ,sizeof (GET_RX_TIMEOUT )); +mce_command_out (ir,GET_RX_TIMEOUT ,sizeof (GET_RX_TIMEOUT ));return 0 ; }
@@ -1028,7 +1085,7 @@ static int mceusb_set_rx_wideband(struct rc_dev *dev, int enable) ir->wideband_rx_enabled = false; cmdbuf[2 ] =1 ;/* port 1 is long range receiver */ } -mce_async_out (ir, cmdbuf,sizeof (cmdbuf)); +mce_command_out (ir, cmdbuf,sizeof (cmdbuf));/* response from device sets ir->learning_active */ return 0 ;
@@ -1051,7 +1108,7 @@ static int mceusb_set_rx_carrier_report(struct rc_dev *dev, int enable) ir->carrier_report_enabled = true;if (!ir->learning_active) { cmdbuf[2 ] =2 ;/* port 2 is short range receiver */ -mce_async_out (ir, cmdbuf,sizeof (cmdbuf)); +mce_command_out (ir, cmdbuf,sizeof (cmdbuf)); } }else { ir->carrier_report_enabled = false;
@@ -1062,7 +1119,7 @@ static int mceusb_set_rx_carrier_report(struct rc_dev *dev, int enable)*/ if (ir->learning_active && !ir->wideband_rx_enabled) { cmdbuf[2 ] =1 ;/* port 1 is long range receiver */ -mce_async_out (ir, cmdbuf,sizeof (cmdbuf)); +mce_command_out (ir, cmdbuf,sizeof (cmdbuf)); } }
@@ -1141,6 +1198,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index) }break ;case MCE_RSP_CMD_ILLEGAL : +case MCE_RSP_TX_TIMEOUT : ir->need_reset = true;break ;default :
@@ -1279,7 +1337,7 @@ static void mceusb_get_emulator_version(struct mceusb_dev *ir) {/* If we get no reply or an illegal command reply, its ver 1, says MS */ ir->emver =1 ; -mce_async_out (ir,GET_EMVER ,sizeof (GET_EMVER )); +mce_command_out (ir,GET_EMVER ,sizeof (GET_EMVER )); }static void mceusb_gen1_init (struct mceusb_dev *ir)
@@ -1325,10 +1383,10 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)dev_dbg (dev,"set handshake - retC = %d" , ret);/* device resume */ -mce_async_out (ir,DEVICE_RESUME ,sizeof (DEVICE_RESUME )); +mce_command_out (ir,DEVICE_RESUME ,sizeof (DEVICE_RESUME ));/* get hw/sw revision? */ -mce_async_out (ir,GET_REVISION ,sizeof (GET_REVISION )); +mce_command_out (ir,GET_REVISION ,sizeof (GET_REVISION ));kfree (data); }
@@ -1336,13 +1394,13 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)static void mceusb_gen2_init (struct mceusb_dev *ir) {/* device resume */ -mce_async_out (ir,DEVICE_RESUME ,sizeof (DEVICE_RESUME )); +mce_command_out (ir,DEVICE_RESUME ,sizeof (DEVICE_RESUME ));/* get wake version (protocol, key, address) */ -mce_async_out (ir,GET_WAKEVERSION ,sizeof (GET_WAKEVERSION )); +mce_command_out (ir,GET_WAKEVERSION ,sizeof (GET_WAKEVERSION ));/* unknown what this one actually returns... */ -mce_async_out (ir,GET_UNKNOWN2 ,sizeof (GET_UNKNOWN2 )); +mce_command_out (ir,GET_UNKNOWN2 ,sizeof (GET_UNKNOWN2 )); }static void mceusb_get_parameters (struct mceusb_dev *ir)
@@ -1356,24 +1414,24 @@ static void mceusb_get_parameters(struct mceusb_dev *ir) ir->num_rxports =2 ;/* get number of tx and rx ports */ -mce_async_out (ir,GET_NUM_PORTS ,sizeof (GET_NUM_PORTS )); +mce_command_out (ir,GET_NUM_PORTS ,sizeof (GET_NUM_PORTS ));/* get the carrier and frequency */ -mce_async_out (ir,GET_CARRIER_FREQ ,sizeof (GET_CARRIER_FREQ )); +mce_command_out (ir,GET_CARRIER_FREQ ,sizeof (GET_CARRIER_FREQ ));if (ir->num_txports && !ir->flags.no_tx)/* get the transmitter bitmask */ -mce_async_out (ir,GET_TX_BITMASK ,sizeof (GET_TX_BITMASK )); +mce_command_out (ir,GET_TX_BITMASK ,sizeof (GET_TX_BITMASK ));/* get receiver timeout value */ -mce_async_out (ir,GET_RX_TIMEOUT ,sizeof (GET_RX_TIMEOUT )); +mce_command_out (ir,GET_RX_TIMEOUT ,sizeof (GET_RX_TIMEOUT ));/* get receiver sensor setting */ -mce_async_out (ir,GET_RX_SENSOR ,sizeof (GET_RX_SENSOR )); +mce_command_out (ir,GET_RX_SENSOR ,sizeof (GET_RX_SENSOR ));for (i =0 ; i < ir->num_txports; i++) { cmdbuf[2 ] = i; -mce_async_out (ir, cmdbuf,sizeof (cmdbuf)); +mce_command_out (ir, cmdbuf,sizeof (cmdbuf)); } }
@@ -1382,7 +1440,7 @@ static void mceusb_flash_led(struct mceusb_dev *ir)if (ir->emver <2 )return ; -mce_async_out (ir,FLASH_LED ,sizeof (FLASH_LED )); +mce_command_out (ir,FLASH_LED ,sizeof (FLASH_LED )); }/*
Signature · 1 line
2.20.1