Linux 5.4.64
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.64 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/devicetree/bindings/mmc/mtk-sd.txt | 2 Documentation/filesystems/affs.txt | 16 Makefile | 2 arch/arc/kernel/perf_event.c | 14 arch/arm64/boot/dts/mediatek/mt7622.dtsi | 2 arch/mips/kernel/smp-bmips.c | 2 arch/mips/kernel/traps.c | 12 arch/mips/mm/c-r4k.c | 4 arch/s390/include/asm/percpu.h | 28 arch/x86/include/asm/ptrace.h | 2 arch/x86/mm/numa_emulation.c | 2 block/blk-core.c | 1 block/blk-iocost.c | 5 drivers/ata/libata-core.c | 5 drivers/ata/libata-scsi.c | 8 drivers/block/nbd.c | 2 drivers/cpuidle/cpuidle.c | 3 drivers/dma/at_hdmac.c | 2 drivers/dma/dw-edma/dw-edma-core.c | 11 drivers/dma/fsldma.h | 12 drivers/dma/of-dma.c | 8 drivers/dma/pl330.c | 2 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 12 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 2 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c | 8 drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c | 14 drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 12 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 4 drivers/gpu/drm/msm/msm_atomic.c | 36 + drivers/gpu/drm/msm/msm_drv.c | 8 drivers/gpu/drm/omapdrm/omap_crtc.c | 3 drivers/hid/hid-ids.h | 3 drivers/hid/hid-quirks.c | 3 drivers/hwmon/applesmc.c | 31 - drivers/iommu/amd_iommu.c | 2 drivers/iommu/intel-iommu.c | 14 drivers/iommu/intel_irq_remapping.c | 10 drivers/md/dm-cache-metadata.c | 8 drivers/md/dm-crypt.c | 2 drivers/md/dm-integrity.c | 12 drivers/md/dm-mpath.c | 22 drivers/md/dm-thin-metadata.c | 10 drivers/md/dm-writecache.c | 12 drivers/md/persistent-data/dm-block-manager.c | 14 drivers/media/platform/vicodec/vicodec-core.c | 1 drivers/media/rc/rc-main.c | 44 - drivers/misc/habanalabs/firmware_if.c | 9 drivers/misc/habanalabs/memory.c | 9 drivers/misc/habanalabs/mmu.c | 2 drivers/mmc/host/cqhci.c | 6 drivers/mmc/host/cqhci.h | 6 drivers/mmc/host/mtk-sd.c | 13 drivers/mmc/host/sdhci-acpi.c | 67 +- drivers/mmc/host/sdhci-pci-core.c | 10 drivers/mmc/host/sdhci-tegra.c | 53 + drivers/net/dsa/microchip/ksz8795.c | 3 drivers/net/dsa/microchip/ksz9477.c | 3 drivers/net/dsa/mt7530.c | 2 drivers/net/ethernet/arc/emac_mdio.c | 1 drivers/net/ethernet/broadcom/bcmsysport.c | 6 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 36 - drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 5 drivers/net/ethernet/broadcom/tg3.c | 17 drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c | 8 drivers/net/ethernet/cortina/gemini.c | 34 - drivers/net/ethernet/hisilicon/hns/hns_enet.c | 9 drivers/net/ethernet/mellanox/mlx4/mr.c | 2 drivers/net/ethernet/renesas/ravb_main.c | 110 +-- drivers/net/ethernet/ti/cpsw.c | 2 drivers/net/gtp.c | 1 drivers/net/usb/asix_common.c | 2 drivers/nvme/host/core.c | 2 drivers/nvme/target/core.c | 6 drivers/nvme/target/fc.c | 4 drivers/staging/media/sunxi/cedrus/cedrus.c | 7 drivers/thermal/qcom/qcom-spmi-temp-alarm.c | 4 drivers/thermal/ti-soc-thermal/omap4-thermal-data.c | 23 drivers/thermal/ti-soc-thermal/omap4xxx-bandgap.h | 10 drivers/tty/serial/qcom_geni_serial.c | 2 drivers/vfio/pci/vfio_pci.c | 349 +++++++++++- drivers/vfio/pci/vfio_pci_config.c | 51 + drivers/vfio/pci/vfio_pci_intrs.c | 14 drivers/vfio/pci/vfio_pci_private.h | 15 drivers/vfio/pci/vfio_pci_rdwr.c | 24 drivers/vfio/vfio_iommu_type1.c | 36 + drivers/xen/xenbus/xenbus_client.c | 10 fs/affs/amigaffs.c | 27 fs/affs/file.c | 26 fs/afs/fs_probe.c | 4 fs/afs/vl_probe.c | 4 fs/btrfs/ctree.c | 6 fs/btrfs/extent-tree.c | 2 fs/btrfs/extent_io.c | 8 fs/btrfs/extent_io.h | 6 fs/btrfs/ioctl.c | 27 fs/btrfs/scrub.c | 122 ++-- fs/btrfs/tree-checker.c | 2 fs/btrfs/volumes.c | 3 fs/ceph/file.c | 1 fs/eventpoll.c | 6 fs/ext2/file.c | 6 fs/xfs/libxfs/xfs_attr_leaf.c | 4 fs/xfs/libxfs/xfs_bmap.c | 2 fs/xfs/xfs_file.c | 12 include/linux/bvec.h | 9 include/linux/libata.h | 1 include/linux/log2.h | 2 include/linux/netfilter/nfnetlink.h | 3 include/net/af_rxrpc.h | 2 include/net/netfilter/nf_tables.h | 2 include/uapi/linux/netfilter/nf_tables.h | 2 mm/hugetlb.c | 26 mm/khugepaged.c | 2 mm/madvise.c | 2 mm/slub.c | 12 net/batman-adv/bat_v_ogm.c | 11 net/batman-adv/bridge_loop_avoidance.c | 5 net/batman-adv/gateway_client.c | 6 net/core/dev.c | 9 net/netfilter/nf_tables_api.c | 64 +- net/netfilter/nfnetlink.c | 11 net/netfilter/nfnetlink_log.c | 3 net/netfilter/nfnetlink_queue.c | 2 net/netfilter/nft_payload.c | 4 net/packet/af_packet.c | 7 net/rxrpc/input.c | 21 net/rxrpc/peer_object.c | 16 net/wireless/reg.c | 3 scripts/checkpatch.pl | 4 sound/core/oss/mulaw.c | 4 sound/firewire/digi00x/digi00x.c | 5 sound/firewire/tascam/tascam.c | 33 - sound/pci/ca0106/ca0106_main.c | 3 sound/pci/hda/hda_intel.c | 2 sound/pci/hda/patch_hdmi.c | 1 sound/pci/hda/patch_realtek.c | 46 + sound/usb/pcm.c | 1 tools/include/uapi/linux/perf_event.h | 2 tools/perf/builtin-record.c | 2 tools/perf/pmu-events/jevents.c | 2 tools/testing/selftests/bpf/test_maps.c | 2 141 files changed, 1503 insertions(+), 502 deletions(-)
Adrian Hunter (2):
mmc: cqhci: Add cqhci_deactivate()
mmc: sdhci-pci: Fix SDHCI_RESET_ALL for CQHCI for Intel GLK-based controllers
Adrien Crivelli (1):
ALSA: hda/realtek: Add quirk for Samsung Galaxy Book Ion NT950XCJ-X716A
Ajay Kaher (3):
vfio/type1: Support faulting PFNMAP vmas
vfio-pci: Fault mmaps to enable vma tracking
vfio-pci: Invalidate mmaps and block MMIO access on disabled memory
Al Grant (1):
perf tools: Correct SNOOPX field offset
Al Viro (1):
fix regression in "epoll: Keep a reference on files added to the check list"
Alex Williamson (1):
vfio/pci: Fix SR-IOV VF handling with MMIO blocking
Alexander Lobakin (1):
net: core: use listified Rx for GRO_NORMAL in napi_gro_receive()
Amit Engel (1):
nvmet: Disable keep-alive timer when kato is cleared to 0h
Chris Wilson (1):
iommu/vt-d: Handle 36bit addressing for x86-32
Christophe JAILLET (1):
nvmet-fc: Fix a missed _irqsave version of spin_lock in 'nvmet_fc_fod_op_done()'
Damien Le Moal (1):
dm crypt: Initialize crypto wait structures
Dan Carpenter (1):
net: gemini: Fix another missing clk_disable_unprepare() in probe
Dan Crawford (1):
ALSA: hda - Fix silent audio output and corrupted input on MSI X570-A PRO
Darrick J. Wong (1):
xfs: fix xfs_bmap_validate_extent_raw when checking attr fork of rt files
David Howells (3):
rxrpc: Keep the ACK serial in a var in rxrpc_input_ack()
rxrpc: Make rxrpc_kernel_get_srtt() indicate validity mm/khugepaged.c: fix khugepaged's request size in collapse_file
Dinghao Liu (4):
drm/amd/display: Fix memleak in amdgpu_dm_mode_config_init
net: hns: Fix memleak in hns_nic_dev_probe
net: systemport: Fix memleak in bcm_sysport_probe
net: arc_emac: Fix memleak in arc_mdio_probe
Dmitry Baryshkov (1):
drm/msm/a6xx: fix gmu start on newer firmware
Edwin Peer (1):
bnxt_en: fix HWRM error when querying VF temperature
Eric Sandeen (1):
xfs: fix boundary test in xfs_attr_shortform_verify
Eugeniu Rosca (1):
mm: slub: fix conversion of freelist_corrupted()
Evan Quan (1):
drm/amd/pm: avoid false alarm due to confusing softwareshutdowntemp setting
Ezequiel Garcia (1):
media: cedrus: Add missing v4l2_ctrl_request_hdl_put()
Florian Fainelli (2):
MIPS: mm: BMIPS5000 has inclusive physical caches
MIPS: BMIPS: Also call bmips_cpu_setup() for secondary cores
Florian Westphal (1):
netfilter: nf_tables: fix destination register zeroing
Furquan Shaikh (1):
drivers: gpu: amd: Initialize amdgpu_dm_backlight_caps object to 0 in amdgpu_dm_update_backlight_caps
Greg Kroah-Hartman (1):
Linux 5.4.64
Gustavo Pimentel (1):
dmaengine: dw-edma: Fix scatter-gather address calculation
Hans Verkuil (1):
media: vicodec: add missing v4l2_ctrl_request_hdl_put()
Himadri Pandya (1):
net: usb: Fix uninit-was-stored issue in asix_read_phy_addr()
Hou Pu (1):
nbd: restore default timeout when setting it to zero
Huang Pei (1):
MIPS: add missing MSACSR and upper MSA initialization
Huang Ying (1):
x86, fakenuma: Fix invalid starting node ID
Jakub Kicinski (1):
bnxt: don't enable NAPI until rings are ready
Jason Gunthorpe (1):
include/linux/log2.h: add missing () around n in roundup_pow_of_two()
Jeff Layton (1):
ceph: don't allow setlease on cephfs
Jens Axboe (1):
block: ensure bdi->io_pages is always initialized
Jesper Dangaard Brouer (1):
selftests/bpf: Fix massive output from test_maps
Johannes Berg (1):
cfg80211: regulatory: reject invalid hints
John Stultz (1):
tty: serial: qcom_geni_serial: Drop __init from qcom_geni_console_setup
Josef Bacik (5):
btrfs: drop path before adding new uuid tree entry
btrfs: allocate scrub workqueues outside of locks
btrfs: set the correct lockdep class for new nodes
btrfs: set the lockdep class for log tree extent buffers
btrfs: fix potential deadlock in the search ioctl
Joshua Sivec (1):
ALSA: usb-audio: Add implicit feedback quirk for UR22C
Jussi Kivilinna (1):
batman-adv: bla: use netif_rx_ni when not in interrupt context
Kai Vehmanen (1):
ALSA: hda/hdmi: always check pin power status in i915 pin fixup
Kalyan Thota (1):
drm/msm/dpu: Fix scale params in plane validation
Keith Busch (1):
nvme: fix controller instance leak
Krishna Manikandan (1):
drm/msm: add shutdown support for display platform_driver
Landen Chao (1):
net: dsa: mt7530: fix advertising unsupported 1000baseT_Half
Linus Lüssing (1):
batman-adv: Fix own OGM check in aggregated OGMs
Linus Torvalds (1):
fsldma: fix very broken 32-bit ppc ioread64 functionality
Lu Baolu (1):
iommu/vt-d: Serialize IOMMU GCMD register modifications
Marek Szyprowski (1):
dmaengine: pl330: Fix burst length if burst size is smaller than bus width
Max Staudt (1):
affs: fix basic permission bits to actually work
Michael Chan (2):
bnxt_en: Fix possible crash in bnxt_fw_reset_task().
tg3: Fix soft lockup when tg3_reset_task() fails.
Mike Snitzer (1):
dm mpath: fix racey management of PG initialization
Mikulas Patocka (4):
ext2: don't update mtime on COW faults
xfs: don't update mtime on COW faults
dm writecache: handle DAX to partitions on persistent memory correctly dm integrity: fix error reporting in bitmap mode after creation
Ming Lei (1):
block: allow for_each_bvec to support zero len bvec
Mrinal Pandey (1):
checkpatch: fix the usage of capture group ( ... )
Muchun Song (1):
mm/hugetlb: fix a race between hugetlb sysctl handlers
Murali Karicheri (1):
net: ethernet: ti: cpsw: fix clean up of vlan mc entries for host port
Namhyung Kim (1):
perf jevents: Fix suspicious code in fixregex()
Nicholas Kazlauskas (1):
drm/amd/display: Reject overlay plane configurations in multi-display scenarios
Nicolas Dichtel (1):
gtp: add GTPA_LINK info to msg sent to userspace
Ofir Bitton (2):
habanalabs: validate FW file size
habanalabs: check correct vmalloc return code
Or Cohen (1):
net/packet: fix overflow in tpacket_rcv
Pablo Neira Ayuso (3):
netfilter: nf_tables: add NFTA_SET_USERDATA if not null
netfilter: nf_tables: incorrect enum nft_list_attributes definition
netfilter: nfnetlink: nfnetlink_unicast() reports EAGAIN instead of ENOBUFS
Pavan Chebbi (1):
bnxt_en: Don't query FW when netif_running() is false.
Peter Ujfalusi (1):
dmaengine: of-dma: Fix of_dma_router_xlate's of_dma_xlate handling
Peter Zijlstra (1):
cpuidle: Fixup IRQ state
Potnuri Bharat Teja (1):
cxgb4: fix thermal zone device registration
Qu Wenruo (1):
btrfs: tree-checker: fix the error message for transid error
Raul E Rangel (1):
mmc: sdhci-acpi: Fix HS400 tuning for AMDI0040
Rob Clark (1):
drm/msm: enable vblank during atomic commits
Sasha Levin (1):
Revert "net: dsa: microchip: set the correct number of ports"
Sean Young (2):
media: rc: do not access device via sysfs after rc_unregister_device()
media: rc: uevent sysfs file races with rc_unregister_device()
Sebastian Parschauer (1):
HID: quirks: Always poll three more Lenovo PixArt mice
Shung-Hsi Yu (1):
net: ethernet: mlx4: Fix memory allocation in mlx4_buddy_init()
Simon Leiner (1):
xen/xenbus: Fix granting of vmalloc'd memory
Sowjanya Komatineni (1):
sdhci: tegra: Add missing TMCLK for data timeout
Suravee Suthikulpanit (1):
iommu/amd: Restore IRTE.RemapEn bit after programming IRTE
Sven Eckelmann (1):
batman-adv: Avoid uninitialized chaddr when handling DHCP
Sven Schnelle (1):
s390: don't trace preemption in percpu macros
Takashi Iwai (2):
ALSA: pcm: oss: Remove superfluous WARN_ON() for mulaw sanity check
ALSA: hda/realtek - Improved routing for Thinkpad X1 7th/8th Gen
Takashi Sakamoto (2):
ALSA: firewire-digi00x: exclude Avid Adrenaline from detection ALSA; firewire-tascam: exclude Tascam FE-8 from detection
Tejun Heo (2):
libata: implement ATA_HORKAGE_MAX_TRIM_128M and apply to Sandisks
blk-iocost: ioc_pd_free() shouldn't assume irq disabled
Tiezhu Yang (1):
Revert "ALSA: hda: Add support for Loongson 7A1000 controller"
Tom Rix (1):
hwmon: (applesmc) check status earlier.
Tomi Valkeinen (1):
drm/omap: fix incorrect lock state
Tong Zhang (1):
ALSA: ca0106: fix error code handling
Tony Lindgren (1):
thermal: ti-soc-thermal: Fix bogus thermal shutdowns for omap4430
Vamshi K Sthambamkadi (1):
tracing/kprobes, x86/ptrace: Fix regs argument order for i386
Vasundhara Volam (2):
bnxt_en: Check for zero dir entries in NVRAM.
bnxt_en: Fix PCI AER error recovery flow
Veera Vegivada (1):
thermal: qcom-spmi-temp-alarm: Don't suppress negative temp
Vineet Gupta (1):
ARC: perf: don't bail setup if pct irq missing in device-tree
Wayne Lin (1):
drm/amd/display: Retry AUX write when fail occurs
Wei Li (1):
perf record: Correct the help info of option "--no-bpf-event"
Wenbin Mei (3):
arm64: dts: mt7622: add reset node for mmc device
mmc: mediatek: add optional module reset property
mmc: dt-bindings: Add resets/reset-names for Mediatek MMC bindings
Yang Shi (1):
mm: madvise: fix vma user-after-free
Ye Bin (3):
dm cache metadata: Avoid returning cmd->bm wild pointer on error
dm thin metadata: Avoid returning cmd->bm wild pointer on error
dm thin metadata: Fix use-after-free in dm_bm_set_read_onlyYu Kuai (1):
dmaengine: at_hdmac: check return value of of_find_device_by_node() in at_dma_xlate()
Yuusuke Ashizuka (1):
ravb: Fixed to be able to unload modules
Greg Kroah-Hartman
maintainerDocumentation/devicetree/bindings/mmc/mtk-sd.txt +2 -0
@@ -49,6 +49,8 @@ Optional properties: error caused by stop clock(fifo full) Valid range = [0:0x7]. if not present, default value is 0. applied to compatible "mediatek,mt2701-mmc". +- resets: Phandle and reset specifier pair to softreset line of MSDC IP. +- reset-names: Should be "hrst". Examples: mmc0: mmc@11230000 {
Documentation/filesystems/affs.txt +10 -6
@@ -93,13 +93,15 @@ The Amiga protection flags RWEDRWEDHSPARWED are handled as follows: - R maps to r for user, group and others. On directories, R implies x. - - If both W and D are allowed, w will be set. + - W maps to w. - E maps to x. - - H and P are always retained and ignored under Linux. + - D is ignored. - - A is always reset when a file is written to. + - H, S and P are always retained and ignored under Linux. + + - A is cleared when a file is written to. User id and group id will be used unless set[gu]id are given as mount options. Since most of the Amiga file systems are single user systems
@@ -111,11 +113,13 @@ Linux -> Amiga: The Linux rwxrwxrwx file mode is handled as follows: - - r permission will set R for user, group and others. + - r permission will allow R for user, group and others. + + - w permission will allow W for user, group and others. - - w permission will set W and D for user, group and others. + - x permission of the user will allow E for plain files. - - x permission of the user will set E for plain files. + - D will be allowed for user, group and others. - All other flags (suid, sgid, ...) are ignored and will not be retained.
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 63 +SUBLEVEL = 64 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/arc/kernel/perf_event.c +4 -10
@@ -562,7 +562,7 @@ static int arc_pmu_device_probe(struct platform_device *pdev) {struct arc_reg_pct_build pct_bcr;struct arc_reg_cc_build cc_bcr; -int i, has_interrupts; +int i, has_interrupts, irq;int counter_size;/* in bits */ union cc_name {
@@ -637,13 +637,7 @@ static int arc_pmu_device_probe(struct platform_device *pdev) .attr_groups = arc_pmu->attr_groups, }; -if (has_interrupts) { -int irq =platform_get_irq (pdev,0 ); - -if (irq <0 ) { -pr_err ("Cannot get IRQ number for the platform\n" ); -return -ENODEV ; - } +if (has_interrupts && (irq =platform_get_irq (pdev,0 ) >=0 )) { arc_pmu->irq = irq;
@@ -652,9 +646,9 @@ static int arc_pmu_device_probe(struct platform_device *pdev) this_cpu_ptr(&arc_pmu_cpu));on_each_cpu (arc_cpu_pmu_irq_init, &irq,1 ); - - }else + }else { arc_pmu->pmu.capabilities |=PERF_PMU_CAP_NO_INTERRUPT ; + }/* * perf parser doesn't really like '-' symbol in events name, so let's
arch/arm64/boot/dts/mediatek/mt7622.dtsi +2 -0
@@ -686,6 +686,8 @@ clocks = <&pericfg CLK_PERI_MSDC30_0_PD>, <&topckgen CLK_TOP_MSDC50_0_SEL>; clock-names = "source", "hclk"; + resets = <&pericfg MT7622_PERI_MSDC0_SW_RST>; + reset-names = "hrst"; status = "disabled"; };
arch/mips/kernel/smp-bmips.c +2 -0
@@ -241,6 +241,8 @@ static int bmips_boot_secondary(int cpu, struct task_struct *idle)*/ static void bmips_init_secondary (void ) { +bmips_cpu_setup (); +switch (current_cpu_type ()) {case CPU_BMIPS4350 :case CPU_BMIPS4380 :
arch/mips/kernel/traps.c +12 -0
@@ -1240,6 +1240,18 @@ static int enable_restore_fp_context(int msa) err =own_fpu_inatomic (1 );if (msa && !err) {enable_msa (); +/* +* with MSA enabled, userspace can see MSACSR +* and MSA regs, but the values in them are from +* other task before current task, restore them +* from saved fp/msa context +*/ +write_msa_csr (current->thread.fpu.msacsr); +/* +* own_fpu_inatomic(1) just restore low 64bit, +* fix the high 64bit +*/ +init_msa_upper ();set_thread_flag (TIF_USEDMSA );set_thread_flag (TIF_MSA_CTX_LIVE ); }
arch/mips/mm/c-r4k.c +4 -0
@@ -1676,7 +1676,11 @@ static void setup_scache(void)printk ("MIPS secondary cache %ldkB, %s, linesize %d bytes.\n" , scache_size >>10 , way_string[c->scache.ways], c->scache.linesz); + +if (current_cpu_type () ==CPU_BMIPS5000 ) + c->options |= MIPS_CPU_INCLUSIVE_CACHES; } +#else if (!(c->scache.flags &MIPS_CACHE_NOT_PRESENT ))panic ("Dunno how to handle MIPS32 / MIPS64 second level cache" );
arch/s390/include/asm/percpu.h +14 -14
@@ -29,7 +29,7 @@typedef typeof (pcp)pcp_op_T__ ; \pcp_op_T__ old__, new__, prev__; \pcp_op_T__ *ptr__; \ -preempt_disable (); \ +preempt_disable_notrace (); \ ptr__ =raw_cpu_ptr (&(pcp)); \ prev__ = *ptr__; \ do { \
@@ -37,7 +37,7 @@ new__ = old__ op (val); \ prev__ =cmpxchg (ptr__, old__, new__); \ }while (prev__ != old__); \ -preempt_enable (); \ +preempt_enable_notrace (); \ new__; \ })
@@ -68,7 +68,7 @@typedef typeof (pcp)pcp_op_T__ ; \pcp_op_T__ val__ = (val); \pcp_op_T__ old__, *ptr__; \ -preempt_disable (); \ +preempt_disable_notrace (); \ ptr__ =raw_cpu_ptr (&(pcp)); \if (__builtin_constant_p (val__) && \ ((szcast )val__ >-129 ) && ((szcast )val__ <128 )) { \
@@ -84,7 +84,7 @@ : [val__] "d" (val__) \ : "cc"); \ } \ -preempt_enable (); \ +preempt_enable_notrace (); \ }#define this_cpu_add_4 (pcp, val) arch_this_cpu_add(pcp, val, "laa", "asi", int)
@@ -95,14 +95,14 @@typedef typeof (pcp)pcp_op_T__ ; \pcp_op_T__ val__ = (val); \pcp_op_T__ old__, *ptr__; \ -preempt_disable (); \ +preempt_disable_notrace (); \ ptr__ =raw_cpu_ptr (&(pcp)); \ asmvolatile ( \ op" %[old__],%[val__],%[ptr__]\n" \ : [old__]"=d" (old__), [ptr__]"+Q" (*ptr__) \ : [val__]"d" (val__) \ :"cc" ); \ -preempt_enable (); \ +preempt_enable_notrace (); \ old__ + val__; \ })
@@ -114,14 +114,14 @@typedef typeof (pcp)pcp_op_T__ ; \pcp_op_T__ val__ = (val); \pcp_op_T__ old__, *ptr__; \ -preempt_disable (); \ +preempt_disable_notrace (); \ ptr__ =raw_cpu_ptr (&(pcp)); \ asmvolatile ( \ op" %[old__],%[val__],%[ptr__]\n" \ : [old__]"=d" (old__), [ptr__]"+Q" (*ptr__) \ : [val__]"d" (val__) \ :"cc" ); \ -preempt_enable (); \ +preempt_enable_notrace (); \ }#define this_cpu_and_4 (pcp, val) arch_this_cpu_to_op(pcp, val, "lan")
@@ -136,10 +136,10 @@typedef typeof (pcp)pcp_op_T__ ; \pcp_op_T__ ret__; \pcp_op_T__ *ptr__; \ -preempt_disable (); \ +preempt_disable_notrace (); \ ptr__ =raw_cpu_ptr (&(pcp)); \ ret__ =cmpxchg (ptr__, oval, nval); \ -preempt_enable (); \ +preempt_enable_notrace (); \ ret__; \ })
@@ -152,10 +152,10 @@ ({ \typeof (pcp) *ptr__; \typeof (pcp) ret__; \ -preempt_disable (); \ +preempt_disable_notrace (); \ ptr__ =raw_cpu_ptr (&(pcp)); \ ret__ =xchg (ptr__, nval); \ -preempt_enable (); \ +preempt_enable_notrace (); \ ret__; \ })
@@ -171,11 +171,11 @@typeof (pcp1) *p1__; \typeof (pcp2) *p2__; \int ret__; \ -preempt_disable (); \ +preempt_disable_notrace (); \ p1__ =raw_cpu_ptr (&(pcp1)); \ p2__ =raw_cpu_ptr (&(pcp2)); \ ret__ =__cmpxchg_double (p1__, p2__, o1__, o2__, n1__, n2__); \ -preempt_enable (); \ +preempt_enable_notrace (); \ ret__; \ })
arch/x86/include/asm/ptrace.h +1 -1
@@ -309,8 +309,8 @@ static inline unsigned long regs_get_kernel_argument(struct pt_regs *regs,static const unsigned int argument_offs[] = { #ifdef __i386__ offsetof(struct pt_regs , ax), - offsetof(struct pt_regs , cx), offsetof(struct pt_regs , dx), + offsetof(struct pt_regs , cx), #define NR_REG_ARGUMENTS 3 #else offsetof(struct pt_regs, di),
arch/x86/mm/numa_emulation.c +1 -1
@@ -321,7 +321,7 @@ static int __init split_nodes_size_interleave(struct numa_meminfo *ei, u64 addr, u64 max_addr, u64 size) { return split_nodes_size_interleave_uniform(ei, pi, addr, max_addr, size, - 0, NULL, NUMA_NO_NODE); + 0, NULL, 0); }int __init setup_emu2phys_nid (int *dfl_phys_nid)
block/blk-core.c +1 -0
@@ -502,6 +502,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id) goto fail_stats; q->backing_dev_info->ra_pages =VM_READAHEAD_PAGES ; + q->backing_dev_info->io_pages =VM_READAHEAD_PAGES ; q->backing_dev_info->capabilities =BDI_CAP_CGROUP_WRITEBACK ; q->backing_dev_info->name ="block" ; q->node = node_id;
block/blk-iocost.c +3 -2
@@ -2074,14 +2074,15 @@ static void ioc_pd_free(struct blkg_policy_data *pd) {struct ioc_gq *iocg =pd_to_iocg (pd);struct ioc *ioc = iocg->ioc; +unsigned long flags;if (ioc) { -spin_lock (&ioc->lock); +spin_lock_irqsave (&ioc->lock, flags);if (!list_empty (&iocg->active_list)) {propagate_active_weight (iocg,0 ,0 );list_del_init (&iocg->active_list); } -spin_unlock (&ioc->lock); +spin_unlock_irqrestore (&ioc->lock, flags);hrtimer_cancel (&iocg->waitq_timer);hrtimer_cancel (&iocg->delay_timer);
drivers/ata/libata-core.c +2 -3
@@ -4474,9 +4474,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {/* https://bugzilla.kernel.org/show_bug.cgi?id=15573 */ { "C300-CTFDDAC128MAG", "0001", ATA_HORKAGE_NONCQ, }, - /* Some Sandisk SSDs lock up hard with NCQ enabled. Reported on - SD7SN6S256G and SD8SN8U256G */ - { "SanDisk SD[78]SN*G", NULL, ATA_HORKAGE_NONCQ, }, + /* Sandisk SD7/8/9s lock up hard on large trims */ + { "SanDisk SD[789]*", NULL, ATA_HORKAGE_MAX_TRIM_128M, }, /* devices which puke on READ_NATIVE_MAX */ { "HDS724040KLSA80", "KFAOA20N", ATA_HORKAGE_BROKEN_HPA, },
drivers/ata/libata-scsi.c +7 -1
@@ -2374,6 +2374,7 @@ static unsigned int ata_scsiop_inq_89(struct ata_scsi_args *args, u8 *rbuf)static unsigned int ata_scsiop_inq_b0 (struct ata_scsi_args *args,u8 *rbuf) { +struct ata_device *dev = args->dev;u16 min_io_sectors; rbuf[1 ] =0xb0 ;
@@ -2399,7 +2400,12 @@ static unsigned int ata_scsiop_inq_b0(struct ata_scsi_args *args, u8 *rbuf)* with the unmap bit set. */ if (ata_id_has_trim (args->id)) { -put_unaligned_be64 (65535 *ATA_MAX_TRIM_RNUM , &rbuf[36 ]); +u64 max_blocks =65535 *ATA_MAX_TRIM_RNUM ; + +if (dev->horkage &ATA_HORKAGE_MAX_TRIM_128M ) + max_blocks =128 << (20 -SECTOR_SHIFT ); + +put_unaligned_be64 (max_blocks, &rbuf[36 ]);put_unaligned_be32 (1 , &rbuf[28 ]); }
drivers/block/nbd.c +2 -0
@@ -1349,6 +1349,8 @@ static void nbd_set_cmd_timeout(struct nbd_device *nbd, u64 timeout) nbd->tag_set.timeout = timeout *HZ ;if (timeout)blk_queue_rq_timeout (nbd->disk->queue, timeout *HZ ); +else +blk_queue_rq_timeout (nbd->disk->queue,30 *HZ ); }/* Must be called with config_lock held */
drivers/cpuidle/cpuidle.c +2 -1
@@ -148,7 +148,8 @@ static void enter_s2idle_proper(struct cpuidle_driver *drv,*/ stop_critical_timings (); drv->states[index].enter_s2idle (dev, drv, index); -WARN_ON (!irqs_disabled ()); +if (WARN_ON_ONCE (!irqs_disabled ())) +local_irq_disable ();/* * timekeeping_resume() that will be called by tick_unfreeze() for the * first CPU executing it calls functions containing RCU read-side
drivers/dma/at_hdmac.c +2 -0
@@ -1667,6 +1667,8 @@ static struct dma_chan *at_dma_xlate(struct of_phandle_args *dma_spec,return NULL ; dmac_pdev =of_find_device_by_node (dma_spec->np); +if (!dmac_pdev) +return NULL ;dma_cap_zero (mask);dma_cap_set (DMA_SLAVE , mask);
drivers/dma/dw-edma/dw-edma-core.c +6 -5
@@ -391,7 +391,7 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer)if (xfer->cyclic) { burst->dar = xfer->xfer.cyclic.paddr; }else { - burst->dar =sg_dma_address (sg); + burst->dar = dst_addr;/* Unlike the typical assumption by other * drivers/IPs the peripheral memory isn't * a FIFO memory, in this case, it's a
@@ -399,14 +399,13 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer)* and destination addresses are increased * by the same portion (data length) */ - src_addr +=sg_dma_len (sg); } }else { burst->dar = dst_addr;if (xfer->cyclic) { burst->sar = xfer->xfer.cyclic.paddr; }else { - burst->sar =sg_dma_address (sg); + burst->sar = src_addr;/* Unlike the typical assumption by other * drivers/IPs the peripheral memory isn't * a FIFO memory, in this case, it's a
@@ -414,12 +413,14 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer)* and destination addresses are increased * by the same portion (data length) */ - dst_addr +=sg_dma_len (sg); } } -if (!xfer->cyclic) +if (!xfer->cyclic) { + src_addr +=sg_dma_len (sg); + dst_addr +=sg_dma_len (sg); sg =sg_next (sg); + } }return vchan_tx_prep (&chan->vc, &desc->vd, xfer->flags);
drivers/dma/fsldma.h +6 -6
@@ -205,10 +205,10 @@ struct fsldma_chan {#else static u64 fsl_ioread64 (const u64 __iomem *addr) { -u32 fsl_addr =lower_32_bits (addr); -u64 fsl_addr_hi = (u64 )in_le32 ((u32 *)(fsl_addr +1 )) <<32 ; +u32 val_lo =in_le32 ((u32 __iomem *)addr); +u32 val_hi =in_le32 ((u32 __iomem *)addr +1 ); -return fsl_addr_hi |in_le32 ((u32 *)fsl_addr); +return ((u64 )val_hi <<32 ) + val_lo; }static void fsl_iowrite64 (u64 val,u64 __iomem *addr)
@@ -219,10 +219,10 @@ static void fsl_iowrite64(u64 val, u64 __iomem *addr)static u64 fsl_ioread64be (const u64 __iomem *addr) { -u32 fsl_addr =lower_32_bits (addr); -u64 fsl_addr_hi = (u64 )in_be32 ((u32 *)fsl_addr) <<32 ; +u32 val_hi =in_be32 ((u32 __iomem *)addr); +u32 val_lo =in_be32 ((u32 __iomem *)addr +1 ); -return fsl_addr_hi |in_be32 ((u32 *)(fsl_addr +1 )); +return ((u64 )val_hi <<32 ) + val_lo; }static void fsl_iowrite64be (u64 val,u64 __iomem *addr)
drivers/dma/of-dma.c +4 -4
@@ -69,12 +69,12 @@ static struct dma_chan *of_dma_router_xlate(struct of_phandle_args *dma_spec,return NULL ; chan = ofdma_target->of_dma_xlate (&dma_spec_target, ofdma_target); -if (chan) { - chan->router = ofdma->dma_router; - chan->route_data = route_data; - }else { +if (IS_ERR_OR_NULL (chan)) { ofdma->dma_router->route_free (ofdma->dma_router->dev, route_data); + }else { + chan->router = ofdma->dma_router; + chan->route_data = route_data; }/*
drivers/dma/pl330.c +1 -1
@@ -2788,6 +2788,7 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,while (burst != (1 << desc->rqcfg.brst_size)) desc->rqcfg.brst_size++; + desc->rqcfg.brst_len =get_burst_len (desc, len);/* * If burst size is smaller than bus width then make sure we only * transfer one at a time to avoid a burst stradling an MFIFO entry.
@@ -2795,7 +2796,6 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,if (desc->rqcfg.brst_size *8 < pl330->pcfg.data_bus_width) desc->rqcfg.brst_len =1 ; - desc->rqcfg.brst_len =get_burst_len (desc, len); desc->bytes_requested = len; desc->txd.flags = flags;
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +10 -2
@@ -2043,12 +2043,18 @@ static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev) &dm_atomic_state_funcs); r =amdgpu_display_modeset_create_props (adev); -if (r) +if (r) { +dc_release_state (state->context); +kfree (state);return r; + } r =amdgpu_dm_audio_init (adev); -if (r) +if (r) { +dc_release_state (state->context); +kfree (state);return r; + }return 0 ; }
@@ -2064,6 +2070,8 @@ static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm)#if defined(CONFIG_ACPI )struct amdgpu_dm_backlight_caps caps; +memset (&caps,0 ,sizeof (caps)); +if (dm->backlight_caps.caps_valid)return ;
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +1 -1
@@ -101,7 +101,7 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, result =dc_link_aux_transfer_raw (TO_DM_AUX (aux)->ddc_service, &payload, &operation_result); -if (payload.write) +if (payload.write && result >=0 ) result = msg->size;if (result <0 )
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +8 -0
@@ -1151,6 +1151,7 @@ static enum dc_status dcn10_validate_global(struct dc *dc, struct dc_state *contbool video_large = false;bool desktop_large = false;bool dcc_disabled = false; +bool mpo_enabled = false;for (i =0 ; i < context->stream_count; i++) {if (context->stream_status[i].plane_count ==0 )
@@ -1159,6 +1160,9 @@ static enum dc_status dcn10_validate_global(struct dc *dc, struct dc_state *contif (context->stream_status[i].plane_count >2 )return DC_FAIL_UNSUPPORTED_1 ; +if (context->stream_status[i].plane_count >1 ) + mpo_enabled = true; +for (j =0 ; j < context->stream_status[i].plane_count; j++) {struct dc_plane_state *plane = context->stream_status[i].plane_states[j];
@@ -1182,6 +1186,10 @@ static enum dc_status dcn10_validate_global(struct dc *dc, struct dc_state *cont } } +/* Disable MPO in multi-display configurations. */ +if (context->stream_count >1 && mpo_enabled) +return DC_FAIL_UNSUPPORTED_1 ; +/* * Workaround: On DCN10 there is UMC issue that causes underflow when * playing 4k video on 4k desktop with video downscaled and single channel
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c +12 -2
@@ -375,8 +375,18 @@ static int vega10_thermal_set_temperature_range(struct pp_hwmgr *hwmgr,/* compare them in unit celsius degree */ if (low < range->min /PP_TEMPERATURE_UNITS_PER_CENTIGRADES ) low = range->min /PP_TEMPERATURE_UNITS_PER_CENTIGRADES ; -if (high > tdp_table->usSoftwareShutdownTemp) - high = tdp_table->usSoftwareShutdownTemp; + +/* +* As a common sense, usSoftwareShutdownTemp should be bigger +* than ThotspotLimit. For any invalid usSoftwareShutdownTemp, +* we will just use the max possible setting VEGA10_THERMAL_MAXIMUM_ALERT_TEMP +* to avoid false alarms. +*/ +if ((tdp_table->usSoftwareShutdownTemp > + range->hotspot_crit_max /PP_TEMPERATURE_UNITS_PER_CENTIGRADES )) { +if (high > tdp_table->usSoftwareShutdownTemp) + high = tdp_table->usSoftwareShutdownTemp; + }if (low > high)return -EINVAL ;
drivers/gpu/drm/msm/adreno/a6xx_gmu.c +11 -1
@@ -199,12 +199,22 @@ static int a6xx_gmu_start(struct a6xx_gmu *gmu) {int ret;u32 val; +u32 mask, reset_val; + + val =gmu_read (gmu,REG_A6XX_GMU_CM3_DTCM_START +0xff8 ); +if (val <=0x20010004 ) { + mask =0xffffffff ; + reset_val =0xbabeface ; + }else { + mask =0x1ff ; + reset_val =0x100 ; + }gmu_write (gmu,REG_A6XX_GMU_CM3_SYSRESET ,1 );gmu_write (gmu,REG_A6XX_GMU_CM3_SYSRESET ,0 ); ret =gmu_poll_timeout (gmu,REG_A6XX_GMU_CM3_FW_INIT_RESULT , val, - val ==0xbabeface ,100 ,10000 ); + (val & mask) == reset_val,100 ,10000 );if (ret)DRM_DEV_ERROR (gmu->dev,"GMU firmware initialization timed out\n" );
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c +2 -2
@@ -853,9 +853,9 @@ static int dpu_plane_atomic_check(struct drm_plane *plane, crtc_state =drm_atomic_get_new_crtc_state (state->state, state->crtc); - min_scale =FRAC_16_16 (1 , pdpu->pipe_sblk->maxdwnscale); + min_scale =FRAC_16_16 (1 , pdpu->pipe_sblk->maxupscale); ret =drm_atomic_helper_check_plane_state (state, crtc_state, min_scale, - pdpu->pipe_sblk->maxupscale <<16 , + pdpu->pipe_sblk->maxdwnscale <<16 , true, true);if (ret) {DPU_ERROR_PLANE (pdpu,"Check plane state failed (%d)\n" , ret);
drivers/gpu/drm/msm/msm_atomic.c +36 -0
@@ -27,6 +27,34 @@ int msm_atomic_prepare_fb(struct drm_plane *plane,return msm_framebuffer_prepare (new_state->fb, kms->aspace); } +/* +* Helpers to control vblanks while we flush.. basically just to ensure +* that vblank accounting is switched on, so we get valid seqn/timestamp +* on pageflip events (if requested) +*/ + +static void vblank_get (struct msm_kms *kms,unsigned crtc_mask) +{ +struct drm_crtc *crtc; + +for_each_crtc_mask (kms->dev, crtc, crtc_mask) { +if (!crtc->state->active) +continue ; +drm_crtc_vblank_get (crtc); + } +} + +static void vblank_put (struct msm_kms *kms,unsigned crtc_mask) +{ +struct drm_crtc *crtc; + +for_each_crtc_mask (kms->dev, crtc, crtc_mask) { +if (!crtc->state->active) +continue ; +drm_crtc_vblank_put (crtc); + } +} +static void msm_atomic_async_commit (struct msm_kms *kms,int crtc_idx) {unsigned crtc_mask =BIT (crtc_idx);
@@ -44,6 +72,8 @@ static void msm_atomic_async_commit(struct msm_kms *kms, int crtc_idx) kms->funcs->enable_commit (kms); +vblank_get (kms, crtc_mask); +/* * Flush hardware updates: */
@@ -58,6 +88,8 @@ static void msm_atomic_async_commit(struct msm_kms *kms, int crtc_idx) kms->funcs->wait_flush (kms, crtc_mask);trace_msm_atomic_wait_flush_finish (crtc_mask); +vblank_put (kms, crtc_mask); +mutex_lock (&kms->commit_lock); kms->funcs->complete_commit (kms, crtc_mask);mutex_unlock (&kms->commit_lock);
@@ -221,6 +253,8 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)*/ kms->pending_crtc_mask &= ~crtc_mask; +vblank_get (kms, crtc_mask); +/* * Flush hardware updates: */
@@ -235,6 +269,8 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state) kms->funcs->wait_flush (kms, crtc_mask);trace_msm_atomic_wait_flush_finish (crtc_mask); +vblank_put (kms, crtc_mask); +mutex_lock (&kms->commit_lock); kms->funcs->complete_commit (kms, crtc_mask);mutex_unlock (&kms->commit_lock);
drivers/gpu/drm/msm/msm_drv.c +8 -0
@@ -1321,6 +1321,13 @@ static int msm_pdev_remove(struct platform_device *pdev)return 0 ; } +static void msm_pdev_shutdown (struct platform_device *pdev) +{ +struct drm_device *drm =platform_get_drvdata (pdev); + +drm_atomic_helper_shutdown (drm); +} +static const struct of_device_id dt_match[] = { { .compatible ="qcom,mdp4" , .data = (void *)KMS_MDP4 }, { .compatible ="qcom,mdss" , .data = (void *)KMS_MDP5 },
@@ -1332,6 +1339,7 @@ MODULE_DEVICE_TABLE(of, dt_match);static struct platform_driver msm_platform_driver = { .probe = msm_pdev_probe, .remove = msm_pdev_remove, + .shutdown = msm_pdev_shutdown, .driver = { .name ="msm" , .of_match_table = dt_match,
drivers/gpu/drm/omapdrm/omap_crtc.c +2 -1
@@ -451,11 +451,12 @@ static void omap_crtc_atomic_enable(struct drm_crtc *crtc,if (omap_state->manually_updated)return ; -spin_lock_irq (&crtc->dev->event_lock);drm_crtc_vblank_on (crtc); + ret =drm_crtc_vblank_get (crtc);WARN_ON (ret !=0 ); +spin_lock_irq (&crtc->dev->event_lock);omap_crtc_arm_event (crtc);spin_unlock_irq (&crtc->dev->event_lock); }
drivers/hid/hid-ids.h +3 -0
@@ -730,6 +730,9 @@#define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3#define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D 0x608d +#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019 0x6019 +#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_602E 0x602e +#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6093 0x6093#define USB_VENDOR_ID_LG 0x1fd2#define USB_DEVICE_ID_LG_MULTITOUCH 0x0064
drivers/hid/hid-quirks.c +3 -0
@@ -105,6 +105,9 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_602E), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6093), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C007), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KEYBOARD_G710_PLUS), HID_QUIRK_NOGET },
drivers/hwmon/applesmc.c +16 -15
@@ -748,15 +748,18 @@ static ssize_t applesmc_light_show(struct device *dev, } ret =applesmc_read_key (LIGHT_SENSOR_LEFT_KEY , buffer, data_length); +if (ret) + goto out;/* newer macbooks report a single 10-bit bigendian value */ if (data_length ==10 ) { left =be16_to_cpu (*(__be16 *)(buffer +6 )) >>2 ; goto out; } left = buffer[2 ]; + + ret =applesmc_read_key (LIGHT_SENSOR_RIGHT_KEY , buffer, data_length);if (ret) goto out; - ret =applesmc_read_key (LIGHT_SENSOR_RIGHT_KEY , buffer, data_length); right = buffer[2 ]; out:
@@ -805,12 +808,11 @@ static ssize_t applesmc_show_fan_speed(struct device *dev, to_index(attr)); ret =applesmc_read_key (newkey, buffer,2 ); - speed = ((buffer[0 ] <<8 | buffer[1 ]) >>2 ); -if (ret)return ret; -else -return snprintf (sysfsbuf,PAGE_SIZE ,"%u\n" , speed); + + speed = ((buffer[0 ] <<8 | buffer[1 ]) >>2 ); +return snprintf (sysfsbuf,PAGE_SIZE ,"%u\n" , speed); } static ssize_t applesmc_store_fan_speed(struct device *dev,
@@ -846,12 +848,11 @@ static ssize_t applesmc_show_fan_manual(struct device *dev,u8 buffer[2 ]; ret =applesmc_read_key (FANS_MANUAL , buffer,2 ); - manual = ((buffer[0 ] <<8 | buffer[1 ]) >>to_index (attr)) &0x01 ; -if (ret)return ret; -else -return snprintf (sysfsbuf,PAGE_SIZE ,"%d\n" , manual); + + manual = ((buffer[0 ] <<8 | buffer[1 ]) >>to_index (attr)) &0x01 ; +return snprintf (sysfsbuf,PAGE_SIZE ,"%d\n" , manual); } static ssize_t applesmc_store_fan_manual(struct device *dev,
@@ -867,10 +868,11 @@ static ssize_t applesmc_store_fan_manual(struct device *dev,return -EINVAL ; ret =applesmc_read_key (FANS_MANUAL , buffer,2 ); - val = (buffer[0 ] <<8 | buffer[1 ]);if (ret) goto out; + val = (buffer[0 ] <<8 | buffer[1 ]); +if (input) val = val | (0x01 <<to_index (attr));else
@@ -946,13 +948,12 @@ static ssize_t applesmc_key_count_show(struct device *dev,u32 count; ret =applesmc_read_key (KEY_COUNT_KEY , buffer,4 ); - count = ((u32 )buffer[0 ]<<24 ) + ((u32 )buffer[1 ]<<16 ) + - ((u32 )buffer[2 ]<<8 ) + buffer[3 ]; -if (ret)return ret; -else -return snprintf (sysfsbuf,PAGE_SIZE ,"%d\n" , count); + + count = ((u32 )buffer[0 ]<<24 ) + ((u32 )buffer[1 ]<<16 ) + + ((u32 )buffer[2 ]<<8 ) + buffer[3 ]; +return snprintf (sysfsbuf,PAGE_SIZE ,"%d\n" , count); } static ssize_t applesmc_key_at_index_read_show(struct device *dev,
drivers/iommu/amd_iommu.c +2 -0
@@ -4431,6 +4431,7 @@ int amd_iommu_deactivate_guest_mode(void *data)struct amd_ir_data *ir_data = (struct amd_ir_data *)data;struct irte_ga *entry = (struct irte_ga *) ir_data->entry;struct irq_cfg *cfg = ir_data->cfg; +u64 valid = entry->lo.fields_remap.valid;if (!AMD_IOMMU_GUEST_IR_VAPIC (amd_iommu_guest_ir) || !entry || !entry->lo.fields_vapic.guest_mode)
@@ -4439,6 +4440,7 @@ int amd_iommu_deactivate_guest_mode(void *data) entry->lo.val =0 ; entry->hi.val =0 ; + entry->lo.fields_remap.valid = valid; entry->lo.fields_remap.dm = apic->irq_dest_mode; entry->lo.fields_remap.int_type = apic->irq_delivery_mode; entry->hi.fields.vector = cfg->vector;
drivers/iommu/intel-iommu.c +7 -7
@@ -123,29 +123,29 @@ static inline unsigned int level_to_offset_bits(int level)return (level -1 ) *LEVEL_STRIDE ; } -static inline int pfn_level_offset (unsigned long pfn,int level) +static inline int pfn_level_offset (u64 pfn,int level) {return (pfn >>level_to_offset_bits (level)) &LEVEL_MASK ; } -static inline unsigned long level_mask (int level) +static inline u64 level_mask (int level) { -return -1UL <<level_to_offset_bits (level); +return -1ULL <<level_to_offset_bits (level); } -static inline unsigned long level_size (int level) +static inline u64 level_size (int level) { -return 1UL <<level_to_offset_bits (level); +return 1ULL <<level_to_offset_bits (level); } -static inline unsigned long align_to_level (unsigned long pfn,int level) +static inline u64 align_to_level (u64 pfn,int level) {return (pfn +level_size (level) -1 ) &level_mask (level); }static inline unsigned long lvl_to_nr_pages (unsigned int lvl) { -return 1 <<min_t (int, (lvl -1 ) *LEVEL_STRIDE ,MAX_AGAW_PFN_WIDTH ); +return 1UL <<min_t (int, (lvl -1 ) *LEVEL_STRIDE ,MAX_AGAW_PFN_WIDTH ); }/* VT-d pages must always be _smaller_ than MM pages. Otherwise things
drivers/iommu/intel_irq_remapping.c +8 -2
@@ -507,12 +507,18 @@ static void iommu_enable_irq_remapping(struct intel_iommu *iommu)/* Enable interrupt-remapping */ iommu->gcmd |=DMA_GCMD_IRE ; - iommu->gcmd &= ~DMA_GCMD_CFI ;/* Block compatibility-format MSIs */ writel (iommu->gcmd, iommu->reg +DMAR_GCMD_REG ); -IOMMU_WAIT_OP (iommu,DMAR_GSTS_REG , readl, (sts &DMA_GSTS_IRES ), sts); +/* Block compatibility-format MSIs */ +if (sts &DMA_GSTS_CFIS ) { + iommu->gcmd &= ~DMA_GCMD_CFI ; +writel (iommu->gcmd, iommu->reg +DMAR_GCMD_REG ); +IOMMU_WAIT_OP (iommu,DMAR_GSTS_REG , + readl, !(sts &DMA_GSTS_CFIS ), sts); + } +/* * With CFI clear in the Global Command register, we should be * protected from dangerous (i.e. compatibility) interrupts
drivers/md/dm-cache-metadata.c +6 -2
@@ -537,12 +537,16 @@ static int __create_persistent_data_objects(struct dm_cache_metadata *cmd, CACHE_MAX_CONCURRENT_LOCKS);if (IS_ERR (cmd->bm)) {DMERR ("could not create block manager" ); -return PTR_ERR (cmd->bm); + r =PTR_ERR (cmd->bm); + cmd->bm =NULL ; +return r; } r =__open_or_format_metadata (cmd, may_format_device); -if (r) +if (r) {dm_block_manager_destroy (cmd->bm); + cmd->bm =NULL ; + }return r; }
drivers/md/dm-crypt.c +1 -1
@@ -720,7 +720,7 @@ static int crypt_iv_eboiv_gen(struct crypt_config *cc, u8 *iv,u8 buf[MAX_CIPHER_BLOCKSIZE ]__aligned(__alignof__(__le64)) ;struct skcipher_request *req;struct scatterlist src, dst; -struct crypto_wait wait; +DECLARE_CRYPTO_WAIT (wait);int err; req =skcipher_request_alloc (any_tfm (cc),GFP_NOIO );
drivers/md/dm-integrity.c +12 -0
@@ -2365,6 +2365,7 @@ static void integrity_recalc(struct work_struct *w) range.logical_sector =le64_to_cpu (ic->sb->recalc_sector);if (unlikely (range.logical_sector >= ic->provided_data_sectors)) {if (ic->mode =='B' ) { +block_bitmap_op (ic, ic->recalc_bitmap,0 , ic->provided_data_sectors,BITMAP_OP_CLEAR );DEBUG_print ("queue_delayed_work: bitmap_flush_work\n" );queue_delayed_work (ic->commit_wq, &ic->bitmap_flush_work,0 ); }
@@ -2442,6 +2443,17 @@ static void integrity_recalc(struct work_struct *w) goto err; } +if (ic->mode =='B' ) { +sector_t start, end; + start = (range.logical_sector >> + (ic->sb->log2_sectors_per_block + ic->log2_blocks_per_bitmap_bit)) << + (ic->sb->log2_sectors_per_block + ic->log2_blocks_per_bitmap_bit); + end = ((range.logical_sector + range.n_sectors) >> + (ic->sb->log2_sectors_per_block + ic->log2_blocks_per_bitmap_bit)) << + (ic->sb->log2_sectors_per_block + ic->log2_blocks_per_bitmap_bit); +block_bitmap_op (ic, ic->recalc_bitmap, start, end - start,BITMAP_OP_CLEAR ); + } + advance_and_next:cond_resched ();
drivers/md/dm-mpath.c +15 -7
@@ -1190,17 +1190,25 @@ static void multipath_wait_for_pg_init_completion(struct multipath *m)static void flush_multipath_work (struct multipath *m) {if (m->hw_handler_name) { -set_bit (MPATHF_PG_INIT_DISABLED , &m->flags); -smp_mb__after_atomic (); +unsigned long flags; + +if (!atomic_read (&m->pg_init_in_progress)) + goto skip; + +spin_lock_irqsave (&m->lock, flags); +if (atomic_read (&m->pg_init_in_progress) && + !test_and_set_bit (MPATHF_PG_INIT_DISABLED , &m->flags)) { +spin_unlock_irqrestore (&m->lock, flags); -if (atomic_read (&m->pg_init_in_progress))flush_workqueue (kmpath_handlerd); -multipath_wait_for_pg_init_completion (m); +multipath_wait_for_pg_init_completion (m); -clear_bit (MPATHF_PG_INIT_DISABLED , &m->flags); -smp_mb__after_atomic (); +spin_lock_irqsave (&m->lock, flags); +clear_bit (MPATHF_PG_INIT_DISABLED , &m->flags); + } +spin_unlock_irqrestore (&m->lock, flags); } - +skip:if (m->queue_mode ==DM_TYPE_BIO_BASED )flush_work (&m->process_queued_bios);flush_work (&m->trigger_event);
drivers/md/dm-thin-metadata.c +7 -3
@@ -739,12 +739,16 @@ static int __create_persistent_data_objects(struct dm_pool_metadata *pmd, bool f THIN_MAX_CONCURRENT_LOCKS);if (IS_ERR (pmd->bm)) {DMERR ("could not create block manager" ); -return PTR_ERR (pmd->bm); + r =PTR_ERR (pmd->bm); + pmd->bm =NULL ; +return r; } r =__open_or_format_metadata (pmd, format_device); -if (r) +if (r) {dm_block_manager_destroy (pmd->bm); + pmd->bm =NULL ; + }return r; }
@@ -954,7 +958,7 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd) }pmd_write_lock_in_core (pmd); -if (!dm_bm_is_read_only (pmd->bm) && !pmd->fail_io) { +if (!pmd->fail_io && !dm_bm_is_read_only (pmd->bm)) { r =__commit_transaction (pmd);if (r <0 ) DMWARN("%s: __commit_transaction() failed, error = %d",
drivers/md/dm-writecache.c +10 -2
@@ -224,6 +224,7 @@ static int persistent_memory_claim(struct dm_writecache *wc)pfn_t pfn;int id;struct page **pages; +sector_t offset; wc->memory_vmapped = false;
@@ -242,9 +243,16 @@ static int persistent_memory_claim(struct dm_writecache *wc) goto err1; } + offset =get_start_sect (wc->ssd_dev->bdev); +if (offset & (PAGE_SIZE /512 -1 )) { + r = -EINVAL ; + goto err1; + } + offset >>=PAGE_SHIFT -9 ; + id =dax_read_lock (); - da =dax_direct_access (wc->ssd_dev->dax_dev,0 , p, &wc->memory_map, &pfn); + da =dax_direct_access (wc->ssd_dev->dax_dev, offset, p, &wc->memory_map, &pfn);if (da <0 ) { wc->memory_map =NULL ; r = da;
@@ -266,7 +274,7 @@ static int persistent_memory_claim(struct dm_writecache *wc) i =0 ; do { long daa; - daa = dax_direct_access(wc->ssd_dev->dax_dev, i, p - i, + daa = dax_direct_access(wc->ssd_dev->dax_dev, offset + i, p - i, NULL, &pfn); if (daa <= 0) { r = daa ? daa : -EINVAL;
drivers/md/persistent-data/dm-block-manager.c +8 -6
@@ -493,7 +493,7 @@ int dm_bm_write_lock(struct dm_block_manager *bm,void *p;int r; -if (bm->read_only) +if (dm_bm_is_read_only (bm))return -EPERM ; p =dm_bufio_read (bm->bufio, b, (struct dm_buffer **) result);
@@ -562,7 +562,7 @@ int dm_bm_write_lock_zero(struct dm_block_manager *bm,struct buffer_aux *aux;void *p; -if (bm->read_only) +if (dm_bm_is_read_only (bm))return -EPERM ; p =dm_bufio_new (bm->bufio, b, (struct dm_buffer **) result);
@@ -602,7 +602,7 @@ EXPORT_SYMBOL_GPL(dm_bm_unlock);int dm_bm_flush (struct dm_block_manager *bm) { -if (bm->read_only) +if (dm_bm_is_read_only (bm))return -EPERM ;return dm_bufio_write_dirty_buffers (bm->bufio);
@@ -616,19 +616,21 @@ void dm_bm_prefetch(struct dm_block_manager *bm, dm_block_t b)bool dm_bm_is_read_only (struct dm_block_manager *bm) { -return bm->read_only; +return (bm ? bm->read_only : true); }EXPORT_SYMBOL_GPL (dm_bm_is_read_only);void dm_bm_set_read_only (struct dm_block_manager *bm) { - bm->read_only = true; +if (bm) + bm->read_only = true; }EXPORT_SYMBOL_GPL (dm_bm_set_read_only);void dm_bm_set_read_write (struct dm_block_manager *bm) { - bm->read_only = false; +if (bm) + bm->read_only = false; }EXPORT_SYMBOL_GPL (dm_bm_set_read_write);
drivers/media/platform/vicodec/vicodec-core.c +1 -0
@@ -2052,6 +2052,7 @@ static int vicodec_request_validate(struct media_request *req) } ctrl =v4l2_ctrl_request_hdl_ctrl_find (hdl, vicodec_ctrl_stateless_state.id); +v4l2_ctrl_request_hdl_put (hdl);if (!ctrl) {v4l2_info (&ctx->dev->v4l2_dev,"Missing required codec control\n" );
drivers/media/rc/rc-main.c +28 -16
85 lines not on this page · raw message
drivers/misc/habanalabs/firmware_if.c +9 -0
@@ -11,6 +11,7 @@#include <linux/genalloc.h> #include <linux/io-64-nonatomic-lo-hi.h> +#define FW_FILE_MAX_SIZE 0x1400000/* maximum size of 20MB */ /** * hl_fw_push_fw_to_device() - Push FW code to device. * @hdev: pointer to hl_device structure.
@@ -43,6 +44,14 @@ int hl_fw_push_fw_to_device(struct hl_device *hdev, const char *fw_name,dev_dbg (hdev->dev,"%s firmware size == %zu\n" , fw_name, fw_size); +if (fw_size >FW_FILE_MAX_SIZE ) { +dev_err (hdev->dev, +"FW file size %zu exceeds maximum of %u bytes\n" , + fw_size,FW_FILE_MAX_SIZE ); + rc = -EINVAL ; + goto out; + } + fw_data = (const u64 *) fw->data;memcpy_toio (dst, fw_data, fw_size);
drivers/misc/habanalabs/memory.c +7 -2
@@ -67,6 +67,11 @@ static int alloc_device_memory(struct hl_ctx *ctx, struct hl_mem_in *args, num_pgs = (args->alloc.mem_size + (page_size -1 )) >> page_shift; total_size = num_pgs << page_shift; +if (!total_size) { +dev_err (hdev->dev,"Cannot allocate 0 bytes\n" ); +return -EINVAL ; + } + contiguous = args->flags &HL_MEM_CONTIGUOUS ;if (contiguous) {
@@ -94,7 +99,7 @@ static int alloc_device_memory(struct hl_ctx *ctx, struct hl_mem_in *args, phys_pg_pack->contiguous = contiguous; phys_pg_pack->pages =kvmalloc_array (num_pgs,sizeof (u64),GFP_KERNEL ); -if (!phys_pg_pack->pages) { +if (ZERO_OR_NULL_PTR (phys_pg_pack->pages)) { rc = -ENOMEM ; goto pages_arr_err; }
@@ -689,7 +694,7 @@ static int init_phys_pg_pack_from_userptr(struct hl_ctx *ctx, phys_pg_pack->pages =kvmalloc_array (total_npages,sizeof (u64),GFP_KERNEL ); -if (!phys_pg_pack->pages) { +if (ZERO_OR_NULL_PTR (phys_pg_pack->pages)) { rc = -ENOMEM ; goto page_pack_arr_mem_err; }
drivers/misc/habanalabs/mmu.c +1 -1
@@ -422,7 +422,7 @@ int hl_mmu_init(struct hl_device *hdev) hdev->mmu_shadow_hop0 =kvmalloc_array (prop->max_asid, prop->mmu_hop_table_size,GFP_KERNEL | __GFP_ZERO); -if (!hdev->mmu_shadow_hop0) { +if (ZERO_OR_NULL_PTR (hdev->mmu_shadow_hop0)) { rc = -ENOMEM ; goto err_pool_add; }
drivers/mmc/host/cqhci.c +3 -3
@@ -299,16 +299,16 @@ static void __cqhci_disable(struct cqhci_host *cq_host) cq_host->activated = false; } -int cqhci_suspend (struct mmc_host *mmc) +int cqhci_deactivate (struct mmc_host *mmc) {struct cqhci_host *cq_host = mmc->cqe_private; -if (cq_host->enabled) +if (cq_host->enabled && cq_host->activated)__cqhci_disable (cq_host);return 0 ; } -EXPORT_SYMBOL (cqhci_suspend); +EXPORT_SYMBOL (cqhci_deactivate);int cqhci_resume (struct mmc_host *mmc) {
drivers/mmc/host/cqhci.h +5 -1
@@ -230,7 +230,11 @@ irqreturn_t cqhci_irq(struct mmc_host *mmc, u32 intmask, int cmd_error, int data_error);int cqhci_init (struct cqhci_host *cq_host,struct mmc_host *mmc,bool dma64);struct cqhci_host *cqhci_pltfm_init (struct platform_device *pdev); -int cqhci_suspend (struct mmc_host *mmc); +int cqhci_deactivate (struct mmc_host *mmc); +static inline int cqhci_suspend (struct mmc_host *mmc) +{ +return cqhci_deactivate (mmc); +}int cqhci_resume (struct mmc_host *mmc);#endif
drivers/mmc/host/mtk-sd.c +13 -0
@@ -22,6 +22,7 @@#include <linux/slab.h> #include <linux/spinlock.h> #include <linux/interrupt.h> +#include <linux/reset.h> #include <linux/mmc/card.h> #include <linux/mmc/core.h>
@@ -412,6 +413,7 @@ struct msdc_host {struct pinctrl_state *pins_uhs;struct delayed_work req_timeout;int irq;/* host interrupt */ +struct reset_control *reset;struct clk *src_clk;/* msdc source clock */ struct clk *h_clk;/* msdc h_clk */
@@ -1474,6 +1476,12 @@ static void msdc_init_hw(struct msdc_host *host)u32 val;u32 tune_reg = host->dev_comp->pad_tune_reg; +if (host->reset) { +reset_control_assert (host->reset); +usleep_range (10 ,50 ); +reset_control_deassert (host->reset); + } +/* Configure to MMC/SD mode, clock free running */ sdr_set_bits (host->base +MSDC_CFG ,MSDC_CFG_MODE |MSDC_CFG_CKPDN );
@@ -2232,6 +2240,11 @@ static int msdc_drv_probe(struct platform_device *pdev)if (IS_ERR (host->src_clk_cg)) host->src_clk_cg =NULL ; + host->reset =devm_reset_control_get_optional_exclusive (&pdev->dev, +"hrst" ); +if (IS_ERR (host->reset)) +return PTR_ERR (host->reset); + host->irq =platform_get_irq (pdev,0 );if (host->irq <0 ) { ret = -EINVAL ;
drivers/mmc/host/sdhci-acpi.c +57 -10
101 lines not on this page · raw message
drivers/mmc/host/sdhci-pci-core.c +9 -1
@@ -232,6 +232,14 @@ static void sdhci_pci_dumpregs(struct mmc_host *mmc)sdhci_dumpregs (mmc_priv (mmc)); } +static void sdhci_cqhci_reset (struct sdhci_host *host,u8 mask) +{ +if ((host->mmc->caps2 &MMC_CAP2_CQE ) && (mask &SDHCI_RESET_ALL ) && + host->mmc->cqe_private) +cqhci_deactivate (host->mmc); +sdhci_reset (host, mask); +} +/*****************************************************************************\ * * * Hardware specific quirk handling *
@@ -722,7 +730,7 @@ static const struct sdhci_ops sdhci_intel_glk_ops = { .set_power = sdhci_intel_set_power, .enable_dma = sdhci_pci_enable_dma, .set_bus_width = sdhci_set_bus_width, - .reset = sdhci_reset, + .reset = sdhci_cqhci_reset, .set_uhs_signaling = sdhci_set_uhs_signaling, .hw_reset = sdhci_pci_hw_reset, .irq = sdhci_cqhci_irq,
drivers/mmc/host/sdhci-tegra.c +51 -2
101 lines not on this page · raw message
drivers/net/dsa/microchip/ksz8795.c +0 -3
@@ -1270,9 +1270,6 @@ static int ksz8795_switch_init(struct ksz_device *dev)/* set the real number of ports */ dev->ds->num_ports = dev->port_cnt; -/* set the real number of ports */ - dev->ds->num_ports = dev->port_cnt; -return 0 ; }
drivers/net/dsa/microchip/ksz9477.c +0 -3
@@ -515,9 +515,6 @@ static int ksz9477_port_vlan_filtering(struct dsa_switch *ds, int port, PORT_VLAN_LOOKUP_VID_0, false); } -/* set the real number of ports */ - dev->ds->num_ports = dev->port_cnt; -return 0 ; }
drivers/net/dsa/mt7530.c +1 -1
@@ -1456,7 +1456,7 @@ static void mt7530_phylink_validate(struct dsa_switch *ds, int port, phylink_set(mask, 100baseT_Full);if (state->interface !=PHY_INTERFACE_MODE_MII ) { - phylink_set(mask, 1000baseT_Half); +/* This switch only supports 1G full-duplex. */ phylink_set(mask, 1000baseT_Full);if (port ==5 ) phylink_set(mask, 1000baseX_Full);
drivers/net/ethernet/arc/emac_mdio.c +1 -0
@@ -153,6 +153,7 @@ int arc_mdio_probe(struct arc_emac_priv *priv)if (IS_ERR (data->reset_gpio)) { error =PTR_ERR (data->reset_gpio);dev_err (priv->dev,"Failed to request gpio: %d\n" , error); +mdiobus_free (bus);return error; }
drivers/net/ethernet/broadcom/bcmsysport.c +4 -2
@@ -2453,8 +2453,10 @@ static int bcm_sysport_probe(struct platform_device *pdev) priv->tx_rings =devm_kcalloc (&pdev->dev, txq,sizeof (struct bcm_sysport_tx_ring ),GFP_KERNEL ); -if (!priv->tx_rings) -return -ENOMEM ; +if (!priv->tx_rings) { + ret = -ENOMEM ; + goto err_free_netdev; + } priv->is_lite = params->is_lite; priv->num_rx_desc_words = params->num_rx_desc_words;
drivers/net/ethernet/broadcom/bnxt/bnxt.c +22 -14
@@ -1143,6 +1143,9 @@ static int bnxt_discard_rx(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,static void bnxt_queue_fw_reset_work (struct bnxt *bp,unsigned long delay) { +if (!(test_bit (BNXT_STATE_IN_FW_RESET , &bp->state))) +return ; +if (BNXT_PF (bp))queue_delayed_work (bnxt_pf_wq, &bp->fw_reset_task, delay);else
@@ -1159,10 +1162,12 @@ static void bnxt_queue_sp_work(struct bnxt *bp)static void bnxt_cancel_sp_work (struct bnxt *bp) { -if (BNXT_PF (bp)) +if (BNXT_PF (bp)) {flush_workqueue (bnxt_pf_wq); -else + }else {cancel_work_sync (&bp->sp_task); +cancel_delayed_work_sync (&bp->fw_reset_task); + } }static void bnxt_sched_reset (struct bnxt *bp,struct bnxt_rx_ring_info *rxr)
@@ -8933,16 +8938,19 @@ static ssize_t bnxt_show_temp(struct device *dev,struct hwrm_temp_monitor_query_input req = {0 };struct hwrm_temp_monitor_query_output *resp;struct bnxt *bp =dev_get_drvdata (dev); -u32 temp =0 ; +u32 len =0 ; resp = bp->hwrm_cmd_resp_addr;bnxt_hwrm_cmd_hdr_init (bp, &req,HWRM_TEMP_MONITOR_QUERY ,-1 ,-1 );mutex_lock (&bp->hwrm_cmd_lock); -if (!_hwrm_send_message (bp, &req,sizeof (req),HWRM_CMD_TIMEOUT )) - temp = resp->temp *1000 ;/* display millidegree */ +if (!_hwrm_send_message_silent (bp, &req,sizeof (req),HWRM_CMD_TIMEOUT )) + len =sprintf (buf,"%u\n" , resp->temp *1000 );/* display millidegree */ mutex_unlock (&bp->hwrm_cmd_lock); -return sprintf (buf,"%u\n" , temp); +if (len) +return len; + +return sprintf (buf,"unknown\n" ); } static SENSOR_DEVICE_ATTR(temp1_input, 0444, bnxt_show_temp, NULL, 0);
@@ -9124,15 +9132,15 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init) } } -bnxt_enable_napi (bp); -bnxt_debug_dev_init (bp); - rc =bnxt_init_nic (bp, irq_re_init);if (rc) {netdev_err (bp->dev,"bnxt_init_nic err: %x\n" , rc); - goto open_err; + goto open_err_irq; } +bnxt_enable_napi (bp); +bnxt_debug_dev_init (bp); +if (link_re_init) {mutex_lock (&bp->link_lock); rc =bnxt_update_phy_setting (bp);
@@ -9163,10 +9171,6 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)bnxt_vf_reps_open (bp);return 0 ; -open_err: -bnxt_debug_dev_exit (bp); -bnxt_disable_napi (bp); - open_err_irq:bnxt_del_napi (bp);
@@ -11386,6 +11390,7 @@ static void bnxt_remove_one(struct pci_dev *pdev)unregister_netdev (dev);bnxt_dl_unregister (bp);bnxt_shutdown_tc (bp); +clear_bit (BNXT_STATE_IN_FW_RESET , &bp->state);bnxt_cancel_sp_work (bp); bp->sp_event =0 ;
@@ -11900,6 +11905,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) (long)pci_resource_start(pdev, 0), dev->dev_addr);pcie_print_link_status (pdev); +pci_save_state (pdev);return 0 ; init_err_cleanup:
@@ -12066,6 +12072,8 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev) "Cannot re-enable PCI device after reset.\n"); }else {pci_set_master (pdev); +pci_restore_state (pdev); +pci_save_state (pdev); err =bnxt_hwrm_func_reset (bp);if (!err &&netif_running (netdev))
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +4 -1
@@ -769,7 +769,7 @@ static void bnxt_get_channels(struct net_device *dev,int max_tx_sch_inputs;/* Get the most up-to-date max_tx_sch_inputs. */ -if (BNXT_NEW_RM (bp)) +if (netif_running (dev) &&BNXT_NEW_RM (bp))bnxt_hwrm_func_resc_qcaps (bp, false); max_tx_sch_inputs = hw_resc->max_tx_sch_inputs;
@@ -2161,6 +2161,9 @@ static int bnxt_get_nvram_directory(struct net_device *dev, u32 len, u8 *data)if (rc !=0 )return rc; +if (!dir_entries || !entry_length) +return -EIO ; +/* Insert 2 bytes of directory info (count and size of entries) */ if (len <2 )return -EINVAL ;
drivers/net/ethernet/broadcom/tg3.c +13 -4
@@ -7227,8 +7227,8 @@ static inline void tg3_reset_task_schedule(struct tg3 *tp)static inline void tg3_reset_task_cancel (struct tg3 *tp) { -cancel_work_sync (&tp->reset_task); -tg3_flag_clear (tp,RESET_TASK_PENDING ); +if (test_and_clear_bit (TG3_FLAG_RESET_TASK_PENDING , tp->tg3_flags)) +cancel_work_sync (&tp->reset_task);tg3_flag_clear (tp,TX_RECOVERY_PENDING ); }
@@ -11219,18 +11219,27 @@ static void tg3_reset_task(struct work_struct *work)tg3_halt (tp,RESET_KIND_SHUTDOWN ,0 ); err =tg3_init_hw (tp, true); -if (err) +if (err) { +tg3_full_unlock (tp); + tp->irq_sync =0 ; +tg3_napi_enable (tp); +/* Clear this flag so that tg3_reset_task_cancel() will not +* call cancel_work_sync() and wait forever. +*/ +tg3_flag_clear (tp,RESET_TASK_PENDING ); +dev_close (tp->dev); goto out; + }tg3_netif_start (tp); -out:tg3_full_unlock (tp);if (!err)tg3_phy_start (tp);tg3_flag_clear (tp,RESET_TASK_PENDING ); +out:rtnl_unlock (); }
drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c +6 -2
@@ -62,6 +62,7 @@ static struct thermal_zone_device_ops cxgb4_thermal_ops = {int cxgb4_thermal_init (struct adapter *adap) {struct ch_thermal *ch_thermal = &adap->ch_thermal; +char ch_tz_name[THERMAL_NAME_LENGTH ];int num_trip =CXGB4_NUM_TRIPS ;u32 param, val;int ret;
@@ -82,7 +83,8 @@ int cxgb4_thermal_init(struct adapter *adap) ch_thermal->trip_type =THERMAL_TRIP_CRITICAL ; } - ch_thermal->tzdev =thermal_zone_device_register ("cxgb4" , num_trip, +snprintf (ch_tz_name,sizeof (ch_tz_name),"cxgb4_%s" , adap->name); + ch_thermal->tzdev =thermal_zone_device_register (ch_tz_name, num_trip,0 , adap, &cxgb4_thermal_ops,NULL ,0 ,0 );
@@ -97,7 +99,9 @@ int cxgb4_thermal_init(struct adapter *adap)int cxgb4_thermal_remove (struct adapter *adap) { -if (adap->ch_thermal.tzdev) +if (adap->ch_thermal.tzdev) {thermal_zone_device_unregister (adap->ch_thermal.tzdev); + adap->ch_thermal.tzdev =NULL ; + }return 0 ; }
drivers/net/ethernet/cortina/gemini.c +17 -17
@@ -2445,8 +2445,8 @@ static int gemini_ethernet_port_probe(struct platform_device *pdev) port->reset =devm_reset_control_get_exclusive (dev,NULL );if (IS_ERR (port->reset)) {dev_err (dev,"no reset\n" ); -clk_disable_unprepare (port->pclk); -return PTR_ERR (port->reset); + ret =PTR_ERR (port->reset); + goto unprepare; }reset_control_reset (port->reset);usleep_range (100 ,500 );
@@ -2501,25 +2501,25 @@ static int gemini_ethernet_port_probe(struct platform_device *pdev)IRQF_SHARED , port_names[port->id], port); -if (ret) { -clk_disable_unprepare (port->pclk); -return ret; - } +if (ret) + goto unprepare; ret =register_netdev (netdev); -if (!ret) { +if (ret) + goto unprepare; + +netdev_info (netdev, +"irq %d, DMA @ 0x%pap, GMAC @ 0x%pap\n" , + port->irq, &dmares->start, + &gmacres->start); + ret =gmac_setup_phy (netdev); +if (ret)netdev_info (netdev, -"irq %d, DMA @ 0x%pap, GMAC @ 0x%pap\n" , - port->irq, &dmares->start, - &gmacres->start); - ret =gmac_setup_phy (netdev); -if (ret) -netdev_info (netdev, -"PHY init failed, deferring to ifup time\n" ); -return 0 ; - } +"PHY init failed, deferring to ifup time\n" ); +return 0 ; - port->netdev =NULL ; +unprepare: +clk_disable_unprepare (port->pclk);return ret; }
drivers/net/ethernet/hisilicon/hns/hns_enet.c +6 -3
@@ -2296,8 +2296,10 @@ static int hns_nic_dev_probe(struct platform_device *pdev) priv->enet_ver =AE_VERSION_1 ; else if (acpi_dev_found(hns_enet_acpi_match[1].id)) priv->enet_ver = AE_VERSION_2; - else - return -ENXIO; + else { + ret = -ENXIO ; + goto out_read_prop_fail; + }/* try to find port-idx-in-ae first */ ret = acpi_node_get_property_reference(dev->fwnode,
@@ -2313,7 +2315,8 @@ static int hns_nic_dev_probe(struct platform_device *pdev) priv->fwnode = args.fwnode; }else {dev_err (dev,"cannot read cfg data from OF or acpi\n" ); -return -ENXIO ; + ret = -ENXIO ; + goto out_read_prop_fail; } ret =device_property_read_u32 (dev,"port-idx-in-ae" , &port_id);
drivers/net/ethernet/mellanox/mlx4/mr.c +1 -1
@@ -114,7 +114,7 @@ static int mlx4_buddy_init(struct mlx4_buddy *buddy, int max_order) goto err_out;for (i =0 ; i <= buddy->max_order; ++i) { - s =BITS_TO_LONGS (1 << (buddy->max_order - i)); + s =BITS_TO_LONGS (1UL << (buddy->max_order - i)); buddy->bits[i] =kvmalloc_array (s,sizeof (long ),GFP_KERNEL | __GFP_ZERO);if (!buddy->bits[i]) goto err_out_free;
drivers/net/ethernet/renesas/ravb_main.c +55 -55
158 lines not on this page · raw message
drivers/net/ethernet/ti/cpsw.c +1 -1
@@ -2209,7 +2209,7 @@ static int cpsw_ndo_vlan_rx_kill_vid(struct net_device *ndev, HOST_PORT_NUM, ALE_VLAN, vid); ret |=cpsw_ale_del_mcast (cpsw->ale, priv->ndev->broadcast,0 ,ALE_VLAN , vid); - ret |=cpsw_ale_flush_multicast (cpsw->ale,0 , vid); + ret |=cpsw_ale_flush_multicast (cpsw->ale,ALE_PORT_HOST , vid); err:pm_runtime_put (cpsw->dev);return ret;
drivers/net/gtp.c +1 -0
@@ -1182,6 +1182,7 @@ static int gtp_genl_fill_info(struct sk_buff *skb, u32 snd_portid, u32 snd_seq, goto nlmsg_failure;if (nla_put_u32 (skb,GTPA_VERSION , pctx->gtp_version) || +nla_put_u32 (skb,GTPA_LINK , pctx->dev->ifindex) ||nla_put_be32 (skb,GTPA_PEER_ADDRESS , pctx->peer_addr_ip4.s_addr) ||nla_put_be32 (skb,GTPA_MS_ADDRESS , pctx->ms_addr_ip4.s_addr)) goto nla_put_failure;
drivers/net/usb/asix_common.c +1 -1
@@ -296,7 +296,7 @@ int asix_read_phy_addr(struct usbnet *dev, int internal)netdev_dbg (dev->net,"asix_get_phy_addr()\n" ); -if (ret <0 ) { +if (ret <2 ) {netdev_err (dev->net,"Error reading PHYID register: %02x\n" , ret); goto out; }
drivers/nvme/host/core.c +1 -1
@@ -4012,7 +4012,7 @@ static void nvme_free_ctrl(struct device *dev) container_of(dev, struct nvme_ctrl, ctrl_device);struct nvme_subsystem *subsys = ctrl->subsys; -if (subsys && ctrl->instance != subsys->instance) +if (!subsys || ctrl->instance != subsys->instance)ida_simple_remove (&nvme_instance_ida, ctrl->instance);kfree (ctrl->effects);
drivers/nvme/target/core.c +6 -0
@@ -369,6 +369,9 @@ static void nvmet_keep_alive_timer(struct work_struct *work)static void nvmet_start_keep_alive_timer (struct nvmet_ctrl *ctrl) { +if (unlikely (ctrl->kato ==0 )) +return ; +pr_debug ("ctrl %d start keep-alive timer for %d secs\n" , ctrl->cntlid, ctrl->kato);
@@ -378,6 +381,9 @@ static void nvmet_start_keep_alive_timer(struct nvmet_ctrl *ctrl)static void nvmet_stop_keep_alive_timer (struct nvmet_ctrl *ctrl) { +if (unlikely (ctrl->kato ==0 )) +return ; +pr_debug ("ctrl %d stop keep-alive\n" , ctrl->cntlid);cancel_delayed_work_sync (&ctrl->ka_work);
drivers/nvme/target/fc.c +2 -2
@@ -1994,9 +1994,9 @@ nvmet_fc_fod_op_done(struct nvmet_fc_fcp_iod *fod)return ;if (fcpreq->fcp_error || fcpreq->transferred_length != fcpreq->transfer_length) { -spin_lock (&fod->flock); +spin_lock_irqsave (&fod->flock, flags); fod->abort = true; -spin_unlock (&fod->flock); +spin_unlock_irqrestore (&fod->flock, flags);nvmet_req_complete (&fod->req,NVME_SC_INTERNAL );return ;
drivers/staging/media/sunxi/cedrus/cedrus.c +6 -1
@@ -159,6 +159,7 @@ static int cedrus_request_validate(struct media_request *req)struct v4l2_ctrl *ctrl_test;unsigned int count;unsigned int i; +int ret =0 ;list_for_each_entry (obj, &req->objects, list) {struct vb2_buffer *vb;
@@ -203,12 +204,16 @@ static int cedrus_request_validate(struct media_request *req)if (!ctrl_test) {v4l2_info (&ctx->dev->v4l2_dev,"Missing required codec control\n" ); -return -ENOENT ; + ret = -ENOENT ; +break ; } }v4l2_ctrl_request_hdl_put (hdl); +if (ret) +return ret; +return vb2_request_validate (req); }
drivers/thermal/qcom/qcom-spmi-temp-alarm.c +2 -2
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0-only /* -* Copyright (c) 2011-2015, 2017, The Linux Foundation. All rights reserved. +* Copyright (c) 2011-2015, 2017, 2020, The Linux Foundation. All rights reserved. */ #include <linux/bitops.h>
@@ -191,7 +191,7 @@ static int qpnp_tm_get_temp(void *data, int *temp) chip->temp = mili_celsius; } - *temp = chip->temp <0 ?0 : chip->temp; + *temp = chip->temp;return 0 ; }
drivers/thermal/ti-soc-thermal/omap4-thermal-data.c +12 -11
@@ -37,20 +37,21 @@ static struct temp_sensor_data omap4430_mpu_temp_sensor_data = {/* * Temperature values in milli degree celsius -* ADC code values from 530 to 923 +* ADC code values from 13 to 107, see TRM +* "18.4.10.2.3 ADC Codes Versus Temperature". */ static const int omap4430_adc_to_temp[OMAP4430_ADC_END_VALUE -OMAP4430_ADC_START_VALUE +1 ] = { --38000 ,-35000 ,-34000 ,-32000 ,-30000 ,-28000 ,-26000 ,-24000 ,-22000 , --20000 ,-18000 ,-17000 ,-15000 ,-13000 ,-12000 ,-10000 ,-8000 ,-6000 , --5000 ,-3000 ,-1000 ,0 ,2000 ,3000 ,5000 ,6000 ,8000 ,10000 ,12000 , -13000 ,15000 ,17000 ,19000 ,21000 ,23000 ,25000 ,27000 ,28000 ,30000 , -32000 ,33000 ,35000 ,37000 ,38000 ,40000 ,42000 ,43000 ,45000 ,47000 , -48000 ,50000 ,52000 ,53000 ,55000 ,57000 ,58000 ,60000 ,62000 ,64000 , -66000 ,68000 ,70000 ,71000 ,73000 ,75000 ,77000 ,78000 ,80000 ,82000 , -83000 ,85000 ,87000 ,88000 ,90000 ,92000 ,93000 ,95000 ,97000 ,98000 , -100000 ,102000 ,103000 ,105000 ,107000 ,109000 ,111000 ,113000 ,115000 , -117000 ,118000 ,120000 ,122000 ,123000 , +-40000 ,-38000 ,-35000 ,-34000 ,-32000 ,-30000 ,-28000 ,-26000 ,-24000 , +-22000 ,-20000 ,-18500 ,-17000 ,-15000 ,-13500 ,-12000 ,-10000 ,-8000 , +-6500 ,-5000 ,-3500 ,-1500 ,0 ,2000 ,3500 ,5000 ,6500 ,8500 ,10000 , +12000 ,13500 ,15000 ,17000 ,19000 ,21000 ,23000 ,25000 ,27000 ,28500 , +30000 ,32000 ,33500 ,35000 ,37000 ,38500 ,40000 ,42000 ,43500 ,45000 , +47000 ,48500 ,50000 ,52000 ,53500 ,55000 ,57000 ,58500 ,60000 ,62000 , +64000 ,66000 ,68000 ,70000 ,71500 ,73500 ,75000 ,77000 ,78500 ,80000 , +82000 ,83500 ,85000 ,87000 ,88500 ,90000 ,92000 ,93500 ,95000 ,97000 , +98500 ,100000 ,102000 ,103500 ,105000 ,107000 ,109000 ,111000 ,113000 , +115000 ,117000 ,118500 ,120000 ,122000 ,123500 ,125000 , };/* OMAP4430 data */
drivers/thermal/ti-soc-thermal/omap4xxx-bandgap.h +7 -3
@@ -53,9 +53,13 @@* and thresholds for OMAP4430. */ -/* ADC conversion table limits */ -#define OMAP4430_ADC_START_VALUE 0 -#define OMAP4430_ADC_END_VALUE 127 +/* +* ADC conversion table limits. Ignore values outside the TRM listed +* range to avoid bogus thermal shutdowns. See omap4430 TRM chapter +* "18.4.10.2.3 ADC Codes Versus Temperature". +*/ +#define OMAP4430_ADC_START_VALUE 13 +#define OMAP4430_ADC_END_VALUE 107/* bandgap clock limits (no control on 4430) */ #define OMAP4430_MAX_FREQ 32768#define OMAP4430_MIN_FREQ 32768
drivers/tty/serial/qcom_geni_serial.c +1 -1
@@ -1063,7 +1063,7 @@ static unsigned int qcom_geni_serial_tx_empty(struct uart_port *uport) }#ifdef CONFIG_SERIAL_QCOM_GENI_CONSOLE -static int __init qcom_geni_console_setup (struct console *co,char *options) +static int qcom_geni_console_setup (struct console *co,char *options) {struct uart_port *uport;struct qcom_geni_serial_port *port;
drivers/vfio/pci/vfio_pci.c +323 -26
450 lines not on this page · raw message
drivers/vfio/pci/vfio_pci_config.c +45 -6
100 lines not on this page · raw message
drivers/vfio/pci/vfio_pci_intrs.c +14 -0
@@ -249,6 +249,7 @@ static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix)struct pci_dev *pdev = vdev->pdev;unsigned int flag = msix ?PCI_IRQ_MSIX :PCI_IRQ_MSI ;int ret; +u16 cmd;if (!is_irq_none (vdev))return -EINVAL ;
@@ -258,13 +259,16 @@ static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix)return -ENOMEM ;/* return the number of supported vectors if we can't get all: */ + cmd =vfio_pci_memory_lock_and_enable (vdev); ret =pci_alloc_irq_vectors (pdev,1 , nvec, flag);if (ret < nvec) {if (ret >0 )pci_free_irq_vectors (pdev); +vfio_pci_memory_unlock_and_restore (vdev, cmd);kfree (vdev->ctx);return ret; } +vfio_pci_memory_unlock_and_restore (vdev, cmd); vdev->num_ctx = nvec; vdev->irq_type = msix ? VFIO_PCI_MSIX_IRQ_INDEX :
@@ -287,6 +291,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,struct pci_dev *pdev = vdev->pdev;struct eventfd_ctx *trigger;int irq, ret; +u16 cmd;if (vector <0 || vector >= vdev->num_ctx)return -EINVAL ;
@@ -295,7 +300,11 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,if (vdev->ctx[vector].trigger) {irq_bypass_unregister_producer (&vdev->ctx[vector].producer); + + cmd =vfio_pci_memory_lock_and_enable (vdev);free_irq (irq, vdev->ctx[vector].trigger); +vfio_pci_memory_unlock_and_restore (vdev, cmd); +kfree (vdev->ctx[vector].name);eventfd_ctx_put (vdev->ctx[vector].trigger); vdev->ctx[vector].trigger =NULL ;
@@ -323,6 +332,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,* such a reset it would be unsuccessful. To avoid this, restore the * cached value of the message prior to enabling. */ + cmd =vfio_pci_memory_lock_and_enable (vdev);if (msix) {struct msi_msg msg;
@@ -332,6 +342,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, ret =request_irq (irq, vfio_msihandler,0 , vdev->ctx[vector].name, trigger); +vfio_pci_memory_unlock_and_restore (vdev, cmd);if (ret) {kfree (vdev->ctx[vector].name);eventfd_ctx_put (trigger);
@@ -376,6 +387,7 @@ static void vfio_msi_disable(struct vfio_pci_device *vdev, bool msix) {struct pci_dev *pdev = vdev->pdev;int i; +u16 cmd;for (i =0 ; i < vdev->num_ctx; i++) {vfio_virqfd_disable (&vdev->ctx[i].unmask);
@@ -384,7 +396,9 @@ static void vfio_msi_disable(struct vfio_pci_device *vdev, bool msix)vfio_msi_set_block (vdev,0 , vdev->num_ctx,NULL , msix); + cmd =vfio_pci_memory_lock_and_enable (vdev);pci_free_irq_vectors (pdev); +vfio_pci_memory_unlock_and_restore (vdev, cmd);/* * Both disable paths above use pci_intx_for_msi() to clear DisINTx
drivers/vfio/pci/vfio_pci_private.h +15 -0
@@ -84,6 +84,11 @@ struct vfio_pci_reflck {struct mutex lock; }; +struct vfio_pci_mmap_vma { +struct vm_area_struct *vma; +struct list_head vma_next; +}; +struct vfio_pci_device {struct pci_dev *pdev;void __iomem *barmap[PCI_STD_RESOURCE_END +1 ];
@@ -122,6 +127,9 @@ struct vfio_pci_device {struct list_head dummy_resources_list;struct mutex ioeventfds_lock;struct list_head ioeventfds_list; +struct mutex vma_lock; +struct list_head vma_list; +struct rw_semaphore memory_lock; };#define is_intx (vdev) (vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX)
@@ -164,6 +172,13 @@ extern int vfio_pci_register_dev_region(struct vfio_pci_device *vdev,extern int vfio_pci_set_power_state (struct vfio_pci_device *vdev,pci_power_t state); +extern bool __vfio_pci_memory_enabled (struct vfio_pci_device *vdev); +extern void vfio_pci_zap_and_down_write_memory_lock (struct vfio_pci_device + *vdev); +extern u16 vfio_pci_memory_lock_and_enable (struct vfio_pci_device *vdev); +extern void vfio_pci_memory_unlock_and_restore (struct vfio_pci_device *vdev, +u16 cmd); +#ifdef CONFIG_VFIO_PCI_IGD extern int vfio_pci_igd_init (struct vfio_pci_device *vdev);#else
drivers/vfio/pci/vfio_pci_rdwr.c +20 -4
@@ -162,6 +162,7 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf,size_t x_start =0 , x_end =0 ;resource_size_t end;void __iomem *io; +struct resource *res = &vdev->pdev->resource[bar];ssize_t done;if (pci_resource_start (pdev, bar))
@@ -177,6 +178,14 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf, count =min (count, (size_t )(end - pos)); +if (res->flags &IORESOURCE_MEM ) { +down_read (&vdev->memory_lock); +if (!__vfio_pci_memory_enabled (vdev)) { +up_read (&vdev->memory_lock); +return -EIO ; + } + } +if (bar ==PCI_ROM_RESOURCE ) {/* * The ROM can fill less space than the BAR, so we start the
@@ -184,13 +193,17 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf,* filling large ROM BARs much faster. */ io =pci_map_rom (pdev, &x_start); -if (!io) -return -ENOMEM ; +if (!io) { + done = -ENOMEM ; + goto out; + } x_end = end; }else {int ret =vfio_pci_setup_barmap (vdev, bar); -if (ret) -return ret; +if (ret) { + done = ret; + goto out; + } io = vdev->barmap[bar]; }
@@ -207,6 +220,9 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf,if (bar ==PCI_ROM_RESOURCE )pci_unmap_rom (pdev, io); +out: +if (res->flags &IORESOURCE_MEM ) +up_read (&vdev->memory_lock);return done; }
drivers/vfio/vfio_iommu_type1.c +33 -3
@@ -335,6 +335,32 @@ static int put_pfn(unsigned long pfn, int prot)return 0 ; } +static int follow_fault_pfn (struct vm_area_struct *vma,struct mm_struct *mm, +unsigned long vaddr,unsigned long *pfn, +bool write_fault) +{ +int ret; + + ret =follow_pfn (vma, vaddr, pfn); +if (ret) { +bool unlocked = false; + + ret =fixup_user_fault (NULL , mm, vaddr, +FAULT_FLAG_REMOTE | + (write_fault ?FAULT_FLAG_WRITE :0 ), + &unlocked); +if (unlocked) +return -EAGAIN ; + +if (ret) +return ret; + + ret =follow_pfn (vma, vaddr, pfn); + } + +return ret; +} +static int vaddr_get_pfn (struct mm_struct *mm,unsigned long vaddr,int prot,unsigned long *pfn) {
@@ -377,12 +403,16 @@ static int vaddr_get_pfn(struct mm_struct *mm, unsigned long vaddr, vaddr =untagged_addr (vaddr); +retry: vma =find_vma_intersection (mm, vaddr, vaddr +1 );if (vma && vma->vm_flags &VM_PFNMAP ) { -if (!follow_pfn (vma, vaddr, pfn) && -is_invalid_reserved_pfn (*pfn)) - ret =0 ; + ret =follow_fault_pfn (vma, mm, vaddr, pfn, prot &IOMMU_WRITE ); +if (ret == -EAGAIN ) + goto retry; + +if (!ret && !is_invalid_reserved_pfn (*pfn)) + ret = -EFAULT ; }up_read (&mm->mmap_sem);
drivers/xen/xenbus/xenbus_client.c +8 -2
@@ -363,8 +363,14 @@ int xenbus_grant_ring(struct xenbus_device *dev, void *vaddr,int i, j;for (i =0 ; i < nr_pages; i++) { - err =gnttab_grant_foreign_access (dev->otherend_id, -virt_to_gfn (vaddr),0 ); +unsigned long gfn; + +if (is_vmalloc_addr (vaddr)) + gfn =pfn_to_gfn (vmalloc_to_pfn (vaddr)); +else + gfn =virt_to_gfn (vaddr); + + err =gnttab_grant_foreign_access (dev->otherend_id, gfn,0 );if (err <0 ) {xenbus_dev_fatal (dev, err,"granting access to ring page" );
fs/affs/amigaffs.c +27 -0
@@ -420,24 +420,51 @@ affs_mode_to_prot(struct inode *inode)u32 prot =AFFS_I (inode)->i_protect;umode_t mode = inode->i_mode; +/* +* First, clear all RWED bits for owner, group, other. +* Then, recalculate them afresh. +* +* We'll always clear the delete-inhibit bit for the owner, as that is +* the classic single-user mode AmigaOS protection bit and we need to +* stay compatible with all scenarios. +* +* Since multi-user AmigaOS is an extension, we'll only set the +* delete-allow bit if any of the other bits in the same user class +* (group/other) are used. +*/ + prot &= ~(FIBF_NOEXECUTE |FIBF_NOREAD + |FIBF_NOWRITE |FIBF_NODELETE + |FIBF_GRP_EXECUTE |FIBF_GRP_READ + |FIBF_GRP_WRITE |FIBF_GRP_DELETE + |FIBF_OTR_EXECUTE |FIBF_OTR_READ + |FIBF_OTR_WRITE |FIBF_OTR_DELETE ); + +/* Classic single-user AmigaOS flags. These are inverted. */ if (!(mode &0100 )) prot |=FIBF_NOEXECUTE ;if (!(mode &0400 )) prot |=FIBF_NOREAD ;if (!(mode &0200 )) prot |=FIBF_NOWRITE ; + +/* Multi-user extended flags. Not inverted. */ if (mode &0010 ) prot |=FIBF_GRP_EXECUTE ;if (mode &0040 ) prot |=FIBF_GRP_READ ;if (mode &0020 ) prot |=FIBF_GRP_WRITE ; +if (mode &0070 ) + prot |=FIBF_GRP_DELETE ; +if (mode &0001 ) prot |=FIBF_OTR_EXECUTE ;if (mode &0004 ) prot |=FIBF_OTR_READ ;if (mode &0002 ) prot |=FIBF_OTR_WRITE ; +if (mode &0007 ) + prot |=FIBF_OTR_DELETE ;AFFS_I (inode)->i_protect = prot; }
fs/affs/file.c +25 -1
@@ -428,6 +428,24 @@ static int affs_write_begin(struct file *file, struct address_space *mapping,return ret; } +static int affs_write_end (struct file *file,struct address_space *mapping, +loff_t pos,unsigned int len,unsigned int copied, +struct page *page,void *fsdata) +{ +struct inode *inode = mapping->host; +int ret; + + ret =generic_write_end (file, mapping, pos, len, copied, page, fsdata); + +/* Clear Archived bit on file writes, as AmigaOS would do */ +if (AFFS_I (inode)->i_protect &FIBF_ARCHIVED ) { +AFFS_I (inode)->i_protect &= ~FIBF_ARCHIVED ; +mark_inode_dirty (inode); + } + +return ret; +} +static sector_t _affs_bmap (struct address_space *mapping,sector_t block) {return generic_block_bmap (mapping,block,affs_get_block);
@@ -437,7 +455,7 @@ const struct address_space_operations affs_aops = { .readpage = affs_readpage, .writepage = affs_writepage, .write_begin = affs_write_begin, - .write_end = generic_write_end, + .write_end = affs_write_end, .direct_IO = affs_direct_IO, .bmap = _affs_bmap };
@@ -794,6 +812,12 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping,if (tmp > inode->i_size) inode->i_size =AFFS_I (inode)->mmu_private = tmp; +/* Clear Archived bit on file writes, as AmigaOS would do */ +if (AFFS_I (inode)->i_protect &FIBF_ARCHIVED ) { +AFFS_I (inode)->i_protect &= ~FIBF_ARCHIVED ; +mark_inode_dirty (inode); + } + err_first_bh:unlock_page (page);put_page (page);
fs/afs/fs_probe.c +2 -2
@@ -92,8 +92,8 @@ void afs_fileserver_probe_result(struct afs_call *call) } } - rtt_us =rxrpc_kernel_get_srtt (call->net->socket, call->rxcall); -if (rtt_us < server->probe.rtt) { +if (rxrpc_kernel_get_srtt (call->net->socket, call->rxcall, &rtt_us) && + rtt_us < server->probe.rtt) { server->probe.rtt = rtt_us; alist->preferred = index; have_result = true;
fs/afs/vl_probe.c +2 -2
@@ -92,8 +92,8 @@ void afs_vlserver_probe_result(struct afs_call *call) } } - rtt_us =rxrpc_kernel_get_srtt (call->net->socket, call->rxcall); -if (rtt_us < server->probe.rtt) { +if (rxrpc_kernel_get_srtt (call->net->socket, call->rxcall, &rtt_us) && + rtt_us < server->probe.rtt) { server->probe.rtt = rtt_us; alist->preferred = index; have_result = true;
fs/btrfs/ctree.c +5 -1
@@ -1339,6 +1339,8 @@ tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct btrfs_path *path,btrfs_tree_read_unlock_blocking (eb);free_extent_buffer (eb); +btrfs_set_buffer_lockdep_class (btrfs_header_owner (eb_rewin), + eb_rewin,btrfs_header_level (eb_rewin));btrfs_tree_read_lock (eb_rewin);__tree_mod_log_rewind (fs_info, eb_rewin, time_seq, tm); WARN_ON(btrfs_header_nritems(eb_rewin) >
@@ -1412,7 +1414,6 @@ get_old_root(struct btrfs_root *root, u64 time_seq)if (!eb)return NULL ; -btrfs_tree_read_lock (eb);if (old_root) {btrfs_set_header_bytenr (eb, eb->start);btrfs_set_header_backref_rev (eb,BTRFS_MIXED_BACKREF_REV );
@@ -1420,6 +1421,9 @@ get_old_root(struct btrfs_root *root, u64 time_seq)btrfs_set_header_level (eb, old_root->level);btrfs_set_header_generation (eb, old_generation); } +btrfs_set_buffer_lockdep_class (btrfs_header_owner (eb), eb, +btrfs_header_level (eb)); +btrfs_tree_read_lock (eb);if (tm)__tree_mod_log_rewind (fs_info, eb, time_seq, tm);else
fs/btrfs/extent-tree.c +1 -1
@@ -4446,7 +4446,7 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root,return ERR_PTR (-EUCLEAN ); } -btrfs_set_buffer_lockdep_class (root->root_key.objectid, buf, level); +btrfs_set_buffer_lockdep_class (owner, buf, level);btrfs_tree_lock (buf);btrfs_clean_tree_block (buf);clear_bit (EXTENT_BUFFER_STALE , &buf->bflags);
fs/btrfs/extent_io.c +4 -4
@@ -5607,9 +5607,9 @@ void read_extent_buffer(const struct extent_buffer *eb, void *dstv, } } -int read_extent_buffer_to_user (const struct extent_buffer *eb, -void __user *dstv, -unsigned long start,unsigned long len) +int read_extent_buffer_to_user_nofault (const struct extent_buffer *eb, +void __user *dstv, +unsigned long start,unsigned long len) {size_t cur;size_t offset;
@@ -5630,7 +5630,7 @@ int read_extent_buffer_to_user(const struct extent_buffer *eb, cur =min (len, (PAGE_SIZE - offset)); kaddr =page_address (page); -if (copy_to_user (dst, kaddr + offset, cur)) { +if (probe_user_write (dst, kaddr + offset, cur)) { ret = -EFAULT ;break ; }
fs/btrfs/extent_io.h +3 -3
@@ -457,9 +457,9 @@ int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,void read_extent_buffer (const struct extent_buffer *eb,void *dst,unsigned long start,unsigned long len); -int read_extent_buffer_to_user (const struct extent_buffer *eb, -void __user *dst,unsigned long start, -unsigned long len); +int read_extent_buffer_to_user_nofault (const struct extent_buffer *eb, +void __user *dst,unsigned long start, +unsigned long len);void write_extent_buffer_fsid (struct extent_buffer *eb,const void *src);void write_extent_buffer_chunk_tree_uuid (struct extent_buffer *eb,const void *src);
fs/btrfs/ioctl.c +20 -7
@@ -2105,9 +2105,14 @@ static noinline int copy_to_sk(struct btrfs_path *path, sh.len = item_len; sh.transid = found_transid;
Lines of this file are not shown. View the raw message.
fs/btrfs/scrub.c +70 -52
122 lines not on this page · raw message
include/uapi/linux/netfilter/nf_tables.h +1 -1
Lines of this file are not shown. View the raw message.
net/netfilter/nf_tables_api.c +31 -33
64 lines not on this page · raw message
sound/pci/hda/patch_realtek.c +44 -2
46 lines not on this page · raw message
tools/testing/selftests/bpf/test_maps.c +2 -0
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.