Linux 5.4.47
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.47 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/lzo.txt | 8 Makefile | 2 arch/arm/boot/dts/at91-sama5d2_ptc_ek.dts | 2 arch/arm/include/asm/kvm_emulate.h | 3 arch/arm/include/asm/kvm_host.h | 2 arch/arm/kernel/ptrace.c | 4 arch/arm64/include/asm/acpi.h | 5 arch/arm64/include/asm/kvm_emulate.h | 6 arch/arm64/include/asm/kvm_host.h | 8 arch/arm64/kvm/handle_exit.c | 19 -- arch/arm64/kvm/sys_regs.c | 10 - arch/csky/abiv2/inc/abi/entry.h | 2 arch/csky/kernel/entry.S | 6 arch/mips/include/asm/kvm_host.h | 6 arch/powerpc/kernel/vmlinux.lds.S | 6 arch/powerpc/mm/ptdump/ptdump.c | 21 +- arch/powerpc/sysdev/xive/common.c | 5 arch/s390/pci/pci_clp.c | 3 arch/x86/events/intel/core.c | 4 arch/x86/include/asm/set_memory.h | 19 +- arch/x86/kernel/cpu/amd.c | 3 arch/x86/kernel/cpu/bugs.c | 92 +++++----- arch/x86/kernel/cpu/mce/core.c | 11 - arch/x86/kernel/process.c | 28 +-- arch/x86/kernel/reboot.c | 8 arch/x86/kernel/time.c | 4 arch/x86/kernel/vmlinux.lds.S | 4 arch/x86/kvm/mmu.c | 46 ++--- arch/x86/kvm/svm.c | 6 arch/x86/kvm/vmx/nested.c | 4 arch/x86/kvm/vmx/vmx.c | 18 + arch/x86/kvm/vmx/vmx.h | 3 arch/x86/kvm/x86.c | 9 arch/x86/pci/fixup.c | 4 crypto/algapi.c | 2 crypto/drbg.c | 4 drivers/acpi/cppc_acpi.c | 1 drivers/acpi/device_pm.c | 2 drivers/acpi/evged.c | 22 ++ drivers/acpi/scan.c | 28 ++- drivers/acpi/sysfs.c | 4 drivers/block/floppy.c | 10 - drivers/char/agp/intel-gtt.c | 4 drivers/clk/clk.c | 6 drivers/cpufreq/cpufreq.c | 11 - drivers/crypto/cavium/nitrox/nitrox_main.c | 4 drivers/crypto/virtio/virtio_crypto_algs.c | 21 +- drivers/edac/i10nm_base.c | 2 drivers/edac/skx_base.c | 20 -- drivers/edac/skx_common.c | 6 drivers/edac/skx_common.h | 2 drivers/firmware/efi/efivars.c | 4 drivers/firmware/imx/imx-scu.c | 72 ++++++- drivers/gpu/drm/i915/gem/i915_gem_userptr.c | 8 drivers/gpu/drm/vkms/vkms_drv.h | 5 drivers/gpu/drm/vkms/vkms_gem.c | 11 - drivers/infiniband/core/uverbs_main.c | 2 drivers/input/mouse/synaptics.c | 1 drivers/input/touchscreen/mms114.c | 12 - drivers/mmc/core/sdio.c | 61 +++--- drivers/mmc/host/mmci_stm32_sdmmc.c | 3 drivers/mmc/host/sdhci-msm.c | 6 drivers/mmc/host/tmio_mmc_core.c | 6 drivers/mmc/host/uniphier-sd.c | 12 - drivers/net/ethernet/ibm/ibmvnic.c | 8 drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c | 4 drivers/net/ethernet/mellanox/mlx5/core/health.c | 14 + drivers/net/ethernet/mellanox/mlx5/core/main.c | 5 drivers/net/ethernet/mellanox/mlxsw/core_thermal.c | 23 ++ drivers/net/net_failover.c | 3 drivers/net/tun.c | 14 + drivers/net/vxlan.c | 4 drivers/net/wireless/ath/ath9k/hif_usb.c | 58 ++++-- drivers/net/wireless/ath/ath9k/hif_usb.h | 6 drivers/net/wireless/ath/ath9k/htc_drv_init.c | 10 - drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 6 drivers/net/wireless/ath/ath9k/htc_hst.c | 6 drivers/net/wireless/ath/ath9k/wmi.c | 6 drivers/net/wireless/ath/ath9k/wmi.h | 3 drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 2 drivers/pci/pci.c | 4 drivers/remoteproc/remoteproc_core.c | 2 drivers/remoteproc/remoteproc_virtio.c | 12 + drivers/scsi/lpfc/lpfc_ct.c | 1 drivers/scsi/megaraid/megaraid_sas_fusion.c | 7 drivers/spi/spi-bcm-qspi.c | 20 -- drivers/spi/spi-bcm2835.c | 4 drivers/spi/spi-bcm2835aux.c | 4 drivers/spi/spi-dw.c | 14 + drivers/spi/spi-pxa2xx.c | 5 drivers/spi/spi.c | 3 drivers/video/fbdev/vt8500lcdfb.c | 1 drivers/video/fbdev/w100fb.c | 2 drivers/watchdog/imx_sc_wdt.c | 5 drivers/xen/pvcalls-back.c | 3 fs/aio.c | 8 fs/cifs/smb2pdu.c | 4 fs/fat/inode.c | 6 fs/gfs2/lops.c | 15 - fs/io_uring.c | 4 fs/nilfs2/segment.c | 2 fs/notify/fanotify/fanotify.c | 5 fs/overlayfs/copy_up.c | 2 fs/proc/inode.c | 2 fs/proc/self.c | 2 fs/proc/thread_self.c | 2 include/asm-generic/vmlinux.lds.h | 22 ++ include/linux/elfnote.h | 2 include/linux/kvm_host.h | 4 include/linux/mm.h | 1 include/linux/padata.h | 6 include/linux/set_memory.h | 2 include/net/inet_hashtables.h | 6 kernel/bpf/sysfs_btf.c | 11 - kernel/events/core.c | 23 +- kernel/padata.c | 14 - kernel/sched/fair.c | 2 lib/lzo/lzo1x_compress.c | 13 + mm/gup.c | 44 ++++ mm/huge_memory.c | 7 mm/slub.c | 4 mm/util.c | 18 + net/bridge/br_arp_nd_proxy.c | 4 net/dccp/proto.c | 7 net/ipv4/fib_trie.c | 3 net/ipv6/ipv6_sockglue.c | 13 - net/sctp/ipv6.c | 20 +- net/sctp/protocol.c | 28 ++- net/sctp/socket.c | 31 ++- scripts/link-vmlinux.sh | 24 +- security/keys/internal.h | 11 - security/keys/keyctl.c | 16 - security/smack/smack.h | 6 security/smack/smack_lsm.c | 25 -- security/smack/smackfs.c | 10 + sound/core/pcm_native.c | 20 +- sound/firewire/fireface/ff-protocol-latter.c | 12 - sound/isa/es1688/es1688.c | 4 sound/pci/hda/patch_realtek.c | 6 sound/soc/codecs/max9867.c | 4 sound/usb/card.c | 19 +- sound/usb/quirks-table.h | 20 ++ sound/usb/usbaudio.h | 2 tools/perf/util/probe-event.c | 3 tools/testing/selftests/ftrace/test.d/ftrace/tracing-error-log.tc | 2 tools/testing/selftests/networking/timestamping/rxtimestamp.c | 1 tools/testing/selftests/tc-testing/tc-tests/filters/tests.json | 6 tools/testing/selftests/tc-testing/tdc_batch.py | 6 virt/kvm/arm/aarch32.c | 28 +++ virt/kvm/arm/arm.c | 22 ++ virt/kvm/kvm_main.c | 26 +- 151 files changed, 1045 insertions(+), 557 deletions(-)
Amir Goldstein (1):
fanotify: fix ignore mask logic for events on child and on dir
Andreas Gruenbacher (1):
gfs2: Even more gfs2_find_jhead fixes
Anthony Steinhauser (3):
x86/speculation: Prevent rogue cross-process SSBD shutdown x86/speculation: Avoid force-disabling IBPB based on STIBP and enhanced IBRS. x86/speculation: PR_SPEC_FORCE_DISABLE enforcement for indirect branches.
Ard Biesheuvel (2):
efi/efivars: Add missing kobject_put() in sysfs entry creation error path
ACPI: GED: add support for _Exx / _Lxx handler methods
Arnd Bergmann (1):
smack: avoid unused 'sip' variable warning
Barret Rhoden (1):
perf: Add cond_resched() to task_function_call()
Bjorn Helgaas (1):
PCI/PM: Adjust pcie_wait_for_link_delay() for caller delay
Bob Haarman (1):
x86_64: Fix jiffies ODR violation
Casey Schaufler (1):
Smack: slab-out-of-bounds in vsscanf
Chris Wilson (1):
agp/intel: Reinforce the barrier after GTT updates
Christophe JAILLET (2):
crypto: cavium/nitrox - Fix 'nitrox_get_first_device()' when ndevlist is fully iterated
video: fbdev: w100fb: Fix a potential double free.
Christophe Leroy (1):
powerpc/ptdump: Properly handle non standard page size
Chuhong Yuan (1):
ALSA: es1688: Add the missed snd_card_free()
Cédric Le Goater (1):
powerpc/xive: Clear the page tables for the ESB IO mapping
Daniel Jordan (1):
padata: add separate cpuhp node for CPUHP_PADATA_DEAD
Dave Rodgman (1):
lib/lzo: fix ambiguous encoding bug in lzo-rle
Denis Efremov (1):
io_uring: use kvfree() in io_sqe_buffer_register()
Dennis Kadioglu (1):
Input: synaptics - add a second working PNP_ID for Lenovo T470s
Dick Kennedy (1):
scsi: lpfc: Fix negation of else clause in lpfc_prep_node_fc4type
Eiichi Tsukata (1):
KVM: x86: Fix APIC page invalidation race
Eric Biggers (1):
crypto: algapi - Avoid spurious modprobe on LOADED
Eric W. Biederman (1):
proc: Use new_inode not new_inode_pseudo
Ezequiel Garcia (1):
drm/vkms: Hold gem object while still in-use
Fabio Estevam (1):
watchdog: imx_sc_wdt: Fix reboot on crash
Fangrui Song (1):
bpf: Support llvm-objcopy for vmlinux BTF
Felipe Franciosi (1):
KVM: x86: respect singlestep when emulating instruction
Florian Fainelli (1):
spi: bcm-qspi: Handle clock probe deferral
Franck LENORMAND (1):
firmware: imx: scu: Fix corruption of header
Fredrik Strupe (1):
ARM: 8977/1: ptrace: Fix mask for thumb breakpoint hook
Greg Kroah-Hartman (1):
Linux 5.4.47
Guo Ren (1):
csky: Fixup abiv2 syscall_trace break a4 & a5
Hangbin Liu (1):
ipv6: fix IPV6_ADDRFORM operation logic
Hill Ma (1):
x86/reboot/quirks: Add MacBook6,1 reboot quirk
Hui Wang (1):
ALSA: hda/realtek - add a pintbl quirk for several Lenovo machines
Ido Schimmel (2):
bridge: Avoid infinite loop when suppressing NS messages with invalid options
vxlan: Avoid infinite loop when suppressing NS messages with invalid options
James Morse (1):
KVM: arm64: Stop writing aarch32's CSSELR into ACTLR
Jason Gunthorpe (1):
RDMA/uverbs: Make the event_queue fds return POLLERR when disassociated
Jens Axboe (1):
sched/fair: Don't NUMA balance for kthreads
Jiri Kosina (1):
block/floppy: fix contended case in floppy_queue_rq()
Juergen Gross (1):
xen/pvcalls-back: test for errors when calling backend_connect()
Justin Chen (1):
spi: bcm-qspi: when tx/rx buffer is NULL set to 0
Kai-Heng Feng (1):
ALSA: usb-audio: Add vendor, product and profile name for HP Thunderbolt Dock
Kan Liang (1):
perf/x86/intel: Add more available bits for OFFCORE_RESPONSE of Intel Tremont
Kim Phillips (1):
x86/cpu/amd: Make erratum #1054 a legacy erratum
Leonard Crestez (1):
firmware: imx: warn on unexpected RX
Linus Torvalds (1):
gup: document and work around "COW can break either way" issue
Longpeng(Mike) (3):
crypto: virtio: Fix use-after-free in virtio_crypto_skcipher_finalize_req()
crypto: virtio: Fix src/dst scatterlist calculation in __virtio_crypto_skcipher_do_req()
crypto: virtio: Fix dest length calculation in __virtio_crypto_skcipher_do_req()
Luca Coelho (1):
iwlwifi: mvm: fix NVM check for 3168 devices
Ludovic Barre (1):
mmc: mmci_sdmmc: fix DMA API warning overlapping mappings
Ludovic Desroches (1):
ARM: dts: at91: sama5d2_ptc_ek: fix sdmmc0 node description
Lukas Wunner (6):
spi: dw: Fix controller unregister order
spi: Fix controller unregister order
spi: pxa2xx: Fix controller unregister order
spi: pxa2xx: Fix runtime PM ref imbalance on probe error
spi: bcm2835: Fix controller unregister order
spi: bcm2835aux: Fix controller unregister order
Marc Zyngier (3):
KVM: arm64: Make vcpu_cp1x() work on Big Endian hosts
KVM: arm64: Synchronize sysreg state on injecting an AArch32 exception
KVM: arm64: Save the host's PtrAuth keys in non-preemptible context
Marcelo Ricardo Leitner (1):
sctp: fix possibly using a bad saddr with a given dst
Masahiro Yamada (1):
mmc: uniphier-sd: call devm_request_irq() after tmio_mmc_host_probe()
Masami Hiramatsu (2):
perf probe: Accept the instance number of kretprobe event selftests/ftrace: Return unsupported if no error_log file
Masashi Honma (1):
ath9k_htc: Silence undersized packet warnings
Maxim Mikityanskiy (1):
net/mlx5e: Fix repeated XSK usage on one channel
Michał Mirosław (2):
ALSA: pcm: disallow linking stream to itself
ALSA: pcm: fix snd_pcm_link() lockdep splat
Miklos Szeredi (1):
aio: fix async fsync creds
Namjae Jeon (1):
smb3: add indatalen that can be a non-zero value to calculation of credit charge in smb2 ioctl
Nick Desaulniers (2):
elfnote: mark all .note sections SHF_ALLOC
arm64: acpi: fix UBSAN warning
OGAWA Hirofumi (1):
fat: don't allow to mount if the FAT length == 0
Paolo Bonzini (3):
KVM: x86: only do L1TF workaround on affected processors
KVM: nSVM: fix condition for filtering async PF
KVM: nSVM: leave ASID aside in copy_vmcb_control_area
Pavel Dobias (1):
ASoC: max9867: fix volume controls
Peng Fan (1):
firmware: imx-scu: Support one TX and one RX
Petr Tesarik (1):
s390/pci: Log new handle in clp_disable_fh()
Qian Cai (1):
ipv4: fix a RCU-list lock in fib_triestat_seq_show
Qiujun Huang (6):
sctp: fix refcount bug in sctp_wfree
ath9k: Fix use-after-free Read in htc_connect_service
ath9k: Fix use-after-free Read in ath9k_wmi_ctrl_rx
ath9k: Fix use-after-free Write in ath9k_htc_rx_msg
ath9x: Fix stack-out-of-bounds Write in ath9k_hif_usb_rx_cb
ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb
Qiushi Wu (2):
ACPI: sysfs: Fix reference count leak in acpi_sysfs_add_hotplug_profile()
ACPI: CPPC: Fix reference count leak in acpi_cppc_processor_probe()
Qiuxu Zhuo (1):
EDAC/skx: Use the mcmtr register to retrieve close_pg/bank_xor_enable
Rafael J. Wysocki (3):
ACPI: PM: Avoid using power resources if there are none for D0
PM: runtime: clk: Fix clk_pm_runtime_get() error path
cpufreq: Fix up cpufreq_boost_set_sw()
Ryusuke Konishi (1):
nilfs2: fix null pointer dereference at nilfs_segctor_do_construct()
Sam Ravnborg (1):
video: vt8500lcdfb: fix fallthrough warning
Sasha Levin (1):
spi: dw: Fix native CS being unset
Sean Christopherson (3):
KVM: x86/mmu: Set mmio_value to '0' if reserved #PF can't be generated
KVM: nVMX: Skip IBPB when switching between vmcs01 and vmcs02
KVM: nVMX: Consult only the "basic" exit reason when routing nested exit
Shay Drory (2):
net/mlx5: drain health workqueue in case of driver load error net/mlx5: Fix fatal error handling during device load
Stephan Gerhold (1):
Input: mms114 - fix handling of mms345l
Steve French (1):
smb3: fix incorrect number of credits when ioctl MaxOutputResponse > 64K
Suman Anna (1):
remoteproc: Fix and restore the parenting hierarchy for vdev
Sumit Saxena (1):
scsi: megaraid_sas: TM command refire leads to controller firmware crash
Takashi Iwai (1):
ALSA: usb-audio: Fix inconsistent card PM state after resume
Takashi Sakamoto (1):
ALSA: fireface: fix configuration error for nominal sampling transfer frequency
Tero Kristo (1):
remoteproc: Fall back to using parent memory pool if no dedicated available
Thomas Falcon (1):
drivers/net/ibmvnic: Update VNIC protocol version reporting
Tony Luck (1):
x86/{mce,mm}: Unmap the entire page if the whole page is affected and poisoned
Ulf Hansson (3):
mmc: tmio: Further fixup runtime PM management at remove
mmc: sdio: Fix potential NULL pointer error in mmc_sdio_init_card()
mmc: sdio: Fix several potential memory leaks in mmc_sdio_init_card()
Vadim Pasternak (1):
mlxsw: core: Use different get_trend() callbacks for different thermal zones
Vasily Averin (1):
net_failover: fixed rollback in net_failover_open()
Veerabhadrarao Badiganti (1):
mmc: sdhci-msm: Clear tuning done flag while hs400 tuning
Vlad Buslov (1):
selftests: fix flower parent qdisc
Waiman Long (1):
mm: add kvfree_sensitive() for freeing sensitive data objects
Wang Hai (2):
dccp: Fix possible memleak in dccp_init and dccp_fini mm/slub: fix a memory leak in sysfs_slab_add()
Wei Yongjun (1):
crypto: drbg - fix error return code in drbg_alloc_state()
Willem de Bruijn (1):
tun: correct header offsets in napi frags mode
Xiaochun Lee (1):
x86/PCI: Mark Intel C620 MROMs as having non-compliant BARs
Xing Li (2):
KVM: MIPS: Define KVM_ENTRYHI_ASID to cpu_asid_mask(&boot_cpu_data)
KVM: MIPS: Fix VPN2_MASK definition for variable cpu_vmbits
Yuxuan Shui (1):
ovl: initialize error in ovl_copy_xattr
tannerlove (1):
selftests/net: in rxtimestamp getopt_long needs terminating null entry
Greg Kroah-Hartman
maintainerDocumentation/lzo.txt +6 -2
@@ -159,11 +159,15 @@ Byte sequences distance = 16384 + (H << 14) + D state = S (copy S literals after this block) End of stream is reached if distance == 16384 + In version 1 only, to prevent ambiguity with the RLE case when + ((distance & 0x803f) == 0x803f) && (261 <= length <= 264), the + compressor must not emit block copies where distance and length + meet these conditions. In version 1 only, this instruction is also used to encode a run of - zeros if distance = 0xbfff, i.e. H = 1 and the D bits are all 1. + zeros if distance = 0xbfff, i.e. H = 1 and the D bits are all 1. In this case, it is followed by a fourth byte, X. - run length = ((X << 3) | (0 0 0 0 0 L L L)) + 4. + run length = ((X << 3) | (0 0 0 0 0 L L L)) + 4 0 0 1 L L L L L (32..63) Copy of small block within 16kB distance (preferably less than 34B)
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 46 +SUBLEVEL = 47 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/arm/boot/dts/at91-sama5d2_ptc_ek.dts +0 -2
@@ -125,8 +125,6 @@ bus-width = <8>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sdmmc0_default>; - non-removable; - mmc-ddr-1_8v; status = "okay"; };
arch/arm/include/asm/kvm_emulate.h +2 -1
@@ -363,6 +363,7 @@ static inline unsigned long vcpu_data_host_to_guest(struct kvm_vcpu *vcpu, } } -static inline void vcpu_ptrauth_setup_lazy (struct kvm_vcpu *vcpu) {} +static inline bool vcpu_has_ptrauth (struct kvm_vcpu *vcpu) {return false; } +static inline void vcpu_ptrauth_disable (struct kvm_vcpu *vcpu) { }#endif /* __ARM_KVM_EMULATE_H__ */
arch/arm/include/asm/kvm_host.h +2 -0
@@ -421,4 +421,6 @@ static inline bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu) return true; } +#define kvm_arm_vcpu_loaded (vcpu) (false) +#endif /* __ARM_KVM_HOST_H__ */
arch/arm/kernel/ptrace.c +2 -2
@@ -219,8 +219,8 @@ static struct undef_hook arm_break_hook = { };static struct undef_hook thumb_break_hook = { - .instr_mask =0xffff , - .instr_val =0xde01 , + .instr_mask =0xffffffff , + .instr_val =0x0000de01 , .cpsr_mask =PSR_T_BIT , .cpsr_val =PSR_T_BIT , .fn = break_trap,
arch/arm64/include/asm/acpi.h +3 -2
@@ -12,6 +12,7 @@#include <linux/efi.h> #include <linux/memblock.h> #include <linux/psci.h> +#include <linux/stddef.h> #include <asm/cputype.h> #include <asm/io.h>
@@ -31,14 +32,14 @@* is therefore used to delimit the MADT GICC structure minimum length * appropriately. */ -#define ACPI_MADT_GICC_MIN_LENGTH ACPI_OFFSET( \ +#define ACPI_MADT_GICC_MIN_LENGTH offsetof( \ struct acpi_madt_generic_interrupt, efficiency_class)#define BAD_MADT_GICC_ENTRY (entry, end) \ (!(entry) || (entry)->header.length < ACPI_MADT_GICC_MIN_LENGTH || \ (unsigned long)(entry) + (entry)->header.length > (end)) -#define ACPI_MADT_GICC_SPE (ACPI_OFFSET(struct acpi_madt_generic_interrupt, \ +#define ACPI_MADT_GICC_SPE (offsetof(struct acpi_madt_generic_interrupt, \ spe_interrupt) + sizeof(u16))/* Basic configuration for ACPI */
arch/arm64/include/asm/kvm_emulate.h +0 -6
@@ -97,12 +97,6 @@ static inline void vcpu_ptrauth_disable(struct kvm_vcpu *vcpu) vcpu->arch.hcr_el2 &= ~(HCR_API |HCR_APK ); } -static inline void vcpu_ptrauth_setup_lazy (struct kvm_vcpu *vcpu) -{ -if (vcpu_has_ptrauth (vcpu)) -vcpu_ptrauth_disable (vcpu); -} -static inline unsigned long vcpu_get_vsesr (struct kvm_vcpu *vcpu) {return vcpu->arch.vsesr_el2;
arch/arm64/include/asm/kvm_host.h +6 -2
@@ -392,8 +392,10 @@ void vcpu_write_sys_reg(struct kvm_vcpu *vcpu, u64 val, int reg);* CP14 and CP15 live in the same array, as they are backed by the * same system registers. */ -#define vcpu_cp14 (v,r) ((v)->arch.ctxt.copro[(r)]) -#define vcpu_cp15 (v,r) ((v)->arch.ctxt.copro[(r)]) +#define CPx_BIAS IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) + +#define vcpu_cp14 (v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS]) +#define vcpu_cp15 (v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS])struct kvm_vm_stat {ulong remote_tlb_flush;
@@ -677,4 +679,6 @@ bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu);#define kvm_arm_vcpu_sve_finalized (vcpu) \ ((vcpu)->arch.flags & KVM_ARM64_VCPU_SVE_FINALIZED) +#define kvm_arm_vcpu_loaded (vcpu) ((vcpu)->arch.sysregs_loaded_on_cpu) +#endif /* __ARM64_KVM_HOST_H__ */
arch/arm64/kvm/handle_exit.c +2 -17
@@ -162,31 +162,16 @@ static int handle_sve(struct kvm_vcpu *vcpu, struct kvm_run *run)return 1 ; } -#define __ptrauth_save_key (regs, key) \ -({ \ - regs[key ## KEYLO_EL1] = read_sysreg_s(SYS_ ## key ## KEYLO_EL1); \ - regs[key ## KEYHI_EL1] = read_sysreg_s(SYS_ ## key ## KEYHI_EL1); \ -}) -/* * Handle the guest trying to use a ptrauth instruction, or trying to access a * ptrauth register. */ void kvm_arm_vcpu_ptrauth_trap (struct kvm_vcpu *vcpu) { -struct kvm_cpu_context *ctxt; - -if (vcpu_has_ptrauth (vcpu)) { +if (vcpu_has_ptrauth (vcpu))vcpu_ptrauth_enable (vcpu); - ctxt = vcpu->arch.host_cpu_context; -__ptrauth_save_key (ctxt->sys_regs,APIA ); -__ptrauth_save_key (ctxt->sys_regs,APIB ); -__ptrauth_save_key (ctxt->sys_regs,APDA ); -__ptrauth_save_key (ctxt->sys_regs,APDB ); -__ptrauth_save_key (ctxt->sys_regs,APGA ); - }else { +else kvm_inject_undefined (vcpu); - } }/*
arch/arm64/kvm/sys_regs.c +8 -2
@@ -1280,10 +1280,16 @@ static bool access_clidr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,static bool access_csselr (struct kvm_vcpu *vcpu,struct sys_reg_params *p,const struct sys_reg_desc *r) { +int reg = r->reg; + +/* See the 32bit mapping in kvm_host.h */ +if (p->is_aarch32) + reg = r->reg /2 ; +if (p->is_write) -vcpu_write_sys_reg (vcpu, p->regval, r->reg); +vcpu_write_sys_reg (vcpu, p->regval, reg);else - p->regval =vcpu_read_sys_reg (vcpu, r->reg); + p->regval =vcpu_read_sys_reg (vcpu, reg);return true; }
arch/csky/abiv2/inc/abi/entry.h +2 -0
@@ -13,6 +13,8 @@#define LSAVE_A1 28#define LSAVE_A2 32#define LSAVE_A3 36 +#define LSAVE_A4 40 +#define LSAVE_A5 44#define KSPTOUSP #define USPTOKSP
arch/csky/kernel/entry.S +4 -2
@@ -170,8 +170,10 @@ csky_syscall_trace: ldw a3, (sp, LSAVE_A3) #if defined(__CSKYABIV2__) subi sp, 8 - stw r5, (sp, 0x4) - stw r4, (sp, 0x0) + ldw r9, (sp, LSAVE_A4) + stw r9, (sp, 0x0) + ldw r9, (sp, LSAVE_A5) + stw r9, (sp, 0x4) #else ldw r6, (sp, LSAVE_A4) ldw r7, (sp, LSAVE_A5)
arch/mips/include/asm/kvm_host.h +5 -1
@@ -274,8 +274,12 @@ enum emulation_result {#define MIPS3_PG_SHIFT 6#define MIPS3_PG_FRAME 0x3fffffc0 +#if defined(CONFIG_64BIT ) +#define VPN2_MASK GENMASK(cpu_vmbits - 1, 13) +#else #define VPN2_MASK 0xffffe000 -#define KVM_ENTRYHI_ASID MIPS_ENTRYHI_ASID +#endif +#define KVM_ENTRYHI_ASID cpu_asid_mask(&boot_cpu_data)#define TLB_IS_GLOBAL (x) ((x).tlb_lo[0] & (x).tlb_lo[1] & ENTRYLO_G)#define TLB_VPN2 (x) ((x).tlb_hi & VPN2_MASK)#define TLB_ASID (x) ((x).tlb_hi & KVM_ENTRYHI_ASID)
arch/powerpc/kernel/vmlinux.lds.S +0 -6
@@ -326,12 +326,6 @@ SECTIONS *(.branch_lt) } -#ifdef CONFIG_DEBUG_INFO_BTF - .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { - *(.BTF) - } -#endif - .opd : AT(ADDR(.opd) - LOAD_OFFSET) { __start_opd = .; KEEP(*(.opd))
arch/powerpc/mm/ptdump/ptdump.c +12 -9
@@ -58,6 +58,7 @@ struct pg_state {unsigned long start_address;unsigned long start_pa;unsigned long last_pa; +unsigned long page_size;unsigned int level;u64 current_flags;bool check_wx;
@@ -155,9 +156,9 @@ static void dump_addr(struct pg_state *st, unsigned long addr)#endif pt_dump_seq_printf (st->seq,REG "-" REG " " , st->start_address, addr -1 ); -if (st->start_pa == st->last_pa && st->start_address +PAGE_SIZE != addr) { +if (st->start_pa == st->last_pa && st->start_address + st->page_size != addr) {pt_dump_seq_printf (st->seq,"[" REG "]" , st->start_pa); - delta =PAGE_SIZE >>10 ; + delta = st->page_size >>10 ; }else {pt_dump_seq_printf (st->seq," " REG " " , st->start_pa); delta = (addr - st->start_address) >>10 ;
@@ -188,7 +189,7 @@ static void note_prot_wx(struct pg_state *st, unsigned long addr) }static void note_page (struct pg_state *st,unsigned long addr, -unsigned int level,u64 val) +unsigned int level,u64 val,unsigned long page_size) {u64 flag = val & pg_level[level].mask;u64 pa = val &PTE_RPN_MASK ;
@@ -200,6 +201,7 @@ static void note_page(struct pg_state *st, unsigned long addr, st->start_address = addr; st->start_pa = pa; st->last_pa = pa; + st->page_size = page_size;pt_dump_seq_printf (st->seq,"---[ %s ]---\n" , st->marker->name);/* * Dump the section of virtual memory when:
@@ -211,7 +213,7 @@ static void note_page(struct pg_state *st, unsigned long addr,*/ }else if (flag != st->current_flags || level != st->level || addr >= st->marker[1 ].start_address || - (pa != st->last_pa +PAGE_SIZE && + (pa != st->last_pa + st->page_size && (pa != st->start_pa || st->start_pa != st->last_pa))) {/* Check the PTE flags */
@@ -239,6 +241,7 @@ static void note_page(struct pg_state *st, unsigned long addr, st->start_address = addr; st->start_pa = pa; st->last_pa = pa; + st->page_size = page_size; st->current_flags = flag; st->level = level; }else {
@@ -254,7 +257,7 @@ static void walk_pte(struct pg_state *st, pmd_t *pmd, unsigned long start)for (i =0 ; i <PTRS_PER_PTE ; i++, pte++) { addr = start + i *PAGE_SIZE ; -note_page (st, addr,4 ,pte_val (*pte)); +note_page (st, addr,4 ,pte_val (*pte),PAGE_SIZE ); } }
@@ -271,7 +274,7 @@ static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start)/* pmd exists */ walk_pte (st, pmd, addr); else - note_page(st, addr, 3, pmd_val(*pmd)); + note_page(st, addr, 3, pmd_val(*pmd), PMD_SIZE); } }
@@ -287,7 +290,7 @@ static void walk_pud(struct pg_state *st, pgd_t *pgd, unsigned long start)/* pud exists */ walk_pmd (st, pud, addr); else - note_page(st, addr, 2, pud_val(*pud)); + note_page(st, addr, 2, pud_val(*pud), PUD_SIZE); } }
@@ -306,7 +309,7 @@ static void walk_pagetables(struct pg_state *st)/* pgd exists */ walk_pud (st, pgd, addr); else - note_page(st, addr, 1, pgd_val(*pgd)); + note_page(st, addr, 1, pgd_val(*pgd), PGDIR_SIZE); } }
@@ -361,7 +364,7 @@ static int ptdump_show(struct seq_file *m, void *v)/* Traverse kernel page tables */ walk_pagetables (&st); -note_page (&st,0 ,0 ,0 ); +note_page (&st,0 ,0 ,0 ,0 );return 0 ; }
arch/powerpc/sysdev/xive/common.c +5 -0
@@ -19,6 +19,7 @@#include <linux/slab.h> #include <linux/spinlock.h> #include <linux/msi.h> +#include <linux/vmalloc.h> #include <asm/prom.h> #include <asm/io.h>
@@ -1013,12 +1014,16 @@ EXPORT_SYMBOL_GPL(is_xive_irq);void xive_cleanup_irq_data (struct xive_irq_data *xd) {if (xd->eoi_mmio) { +unmap_kernel_range ((unsigned long )xd->eoi_mmio, +1u << xd->esb_shift);iounmap (xd->eoi_mmio);if (xd->eoi_mmio == xd->trig_mmio) xd->trig_mmio =NULL ; xd->eoi_mmio =NULL ; }if (xd->trig_mmio) { +unmap_kernel_range ((unsigned long )xd->trig_mmio, +1u << xd->esb_shift);iounmap (xd->trig_mmio); xd->trig_mmio =NULL ; }
arch/s390/pci/pci_clp.c +1 -2
@@ -309,14 +309,13 @@ int clp_enable_fh(struct zpci_dev *zdev, u8 nr_dma_as)int clp_disable_fh (struct zpci_dev *zdev) { -u32 fh = zdev->fh;int rc;if (!zdev_enabled (zdev))return 0 ; rc =clp_set_pci_fn (zdev,0 ,CLP_SET_DISABLE_PCI_FN ); -zpci_dbg (3 ,"dis fid:%x, fh:%x, rc:%d\n" , zdev->fid, fh, rc); +zpci_dbg (3 ,"dis fid:%x, fh:%x, rc:%d\n" , zdev->fid, zdev->fh, rc);return rc; }
arch/x86/events/intel/core.c +2 -2
@@ -1892,8 +1892,8 @@ static __initconst const u64 tnt_hw_cache_extra_regsstatic struct extra_reg intel_tnt_extra_regs[]__read_mostly = {/* must define OFFCORE_RSP_X first, see intel_fixup_er() */ -INTEL_UEVENT_EXTRA_REG (0x01b7 ,MSR_OFFCORE_RSP_0 ,0xffffff9fffull ,RSP_0 ), -INTEL_UEVENT_EXTRA_REG (0x02b7 ,MSR_OFFCORE_RSP_1 ,0xffffff9fffull ,RSP_1 ), +INTEL_UEVENT_EXTRA_REG (0x01b7 ,MSR_OFFCORE_RSP_0 ,0x800ff0ffffff9fffull ,RSP_0 ), +INTEL_UEVENT_EXTRA_REG (0x02b7 ,MSR_OFFCORE_RSP_1 ,0xff0ffffff9fffull ,RSP_1 ),EVENT_EXTRA_END };
arch/x86/include/asm/set_memory.h +13 -6
@@ -85,28 +85,35 @@ void set_kernel_text_rw(void);void set_kernel_text_ro (void );#ifdef CONFIG_X86_64 -static inline int set_mce_nospec (unsigned long pfn) +/* +* Prevent speculative access to the page by either unmapping +* it (if we do not require access to any part of the page) or +* marking it uncacheable (if we want to try to retrieve data +* from non-poisoned lines in the page). +*/ +static inline int set_mce_nospec (unsigned long pfn,bool unmap) {unsigned long decoy_addr;int rc;/* -* Mark the linear address as UC to make sure we don't log more -* errors because of speculative access to the page. * We would like to just call: -* set_memory_uc((unsigned long)pfn_to_kaddr(pfn), 1); +* set_memory_XX((unsigned long)pfn_to_kaddr(pfn), 1); * but doing that would radically increase the odds of a * speculative access to the poison page because we'd have * the virtual address of the kernel 1:1 mapping sitting * around in registers. * Instead we get tricky. We create a non-canonical address * that looks just like the one we want, but has bit 63 flipped. -* This relies on set_memory_uc() properly sanitizing any __pa() +* This relies on set_memory_XX() properly sanitizing any __pa() * results with __PHYSICAL_MASK or PTE_PFN_MASK. */ decoy_addr = (pfn <<PAGE_SHIFT ) + (PAGE_OFFSET ^BIT (63 )); - rc =set_memory_uc (decoy_addr,1 ); +if (unmap) + rc =set_memory_np (decoy_addr,1 ); +else + rc =set_memory_uc (decoy_addr,1 );if (rc)pr_warn ("Could not invalidate pfn=0x%lx from 1:1 map\n" , pfn);return rc;
arch/x86/kernel/cpu/amd.c +1 -2
@@ -1117,8 +1117,7 @@ static const int amd_erratum_383[] =/* #1054: Instructions Retired Performance Counter May Be Inaccurate */ static const int amd_erratum_1054[] = -AMD_OSVW_ERRATUM (0 ,AMD_MODEL_RANGE (0x17 ,0 ,0 ,0x2f ,0xf )); - +AMD_LEGACY_ERRATUM (AMD_MODEL_RANGE (0x17 ,0 ,0 ,0x2f ,0xf ));static bool cpu_has_amd_erratum (struct cpuinfo_x86 *cpu,const int *erratum) {
arch/x86/kernel/cpu/bugs.c +54 -38
166 lines not on this page · raw message
arch/x86/kernel/cpu/mce/core.c +9 -2
@@ -533,6 +533,13 @@ bool mce_is_memory_error(struct mce *m) }EXPORT_SYMBOL_GPL (mce_is_memory_error); +static bool whole_page (struct mce *m) +{ +if (!mca_cfg.ser || !(m->status &MCI_STATUS_MISCV )) +return true; +return MCI_MISC_ADDR_LSB (m->misc) >=PAGE_SHIFT ; +} +bool mce_is_correctable (struct mce *m) {if (m->cpuvendor ==X86_VENDOR_AMD && m->status &MCI_STATUS_DEFERRED )
@@ -601,7 +608,7 @@ static int srao_decode_notifier(struct notifier_block *nb, unsigned long val,if (mce_usable_address (mce) && (mce->severity ==MCE_AO_SEVERITY )) { pfn = mce->addr >>PAGE_SHIFT ;if (!memory_failure (pfn,0 )) -set_mce_nospec (pfn); +set_mce_nospec (pfn,whole_page (mce)); }return NOTIFY_OK ;
@@ -1103,7 +1110,7 @@ static int do_memory_failure(struct mce *m)if (ret)pr_err ("Memory error not recovered" );else -set_mce_nospec (m->addr >>PAGE_SHIFT ); +set_mce_nospec (m->addr >>PAGE_SHIFT ,whole_page (m));return ret; }
arch/x86/kernel/process.c +10 -18
@@ -428,28 +428,20 @@ static __always_inline void __speculation_ctrl_update(unsigned long tifp,lockdep_assert_irqs_disabled (); -/* -* If TIF_SSBD is different, select the proper mitigation -* method. Note that if SSBD mitigation is disabled or permanentely -* enabled this branch can't be taken because nothing can set -* TIF_SSBD. -*/ -if (tif_diff & _TIF_SSBD) { -if (static_cpu_has (X86_FEATURE_VIRT_SSBD )) { +/* Handle change of TIF_SSBD depending on the mitigation method. */ +if (static_cpu_has (X86_FEATURE_VIRT_SSBD )) { +if (tif_diff & _TIF_SSBD)amd_set_ssb_virt_state (tifn); - }else if (static_cpu_has (X86_FEATURE_LS_CFG_SSBD )) { + }else if (static_cpu_has (X86_FEATURE_LS_CFG_SSBD )) { +if (tif_diff & _TIF_SSBD)amd_set_core_ssb_state (tifn); - }else if (static_cpu_has (X86_FEATURE_SPEC_CTRL_SSBD ) || -static_cpu_has (X86_FEATURE_AMD_SSBD )) { - msr |=ssbd_tif_to_spec_ctrl (tifn); - updmsr = true; - } + }else if (static_cpu_has (X86_FEATURE_SPEC_CTRL_SSBD ) || +static_cpu_has (X86_FEATURE_AMD_SSBD )) { + updmsr |= !!(tif_diff & _TIF_SSBD); + msr |=ssbd_tif_to_spec_ctrl (tifn); } -/* -* Only evaluate TIF_SPEC_IB if conditional STIBP is enabled, -* otherwise avoid the MSR write. -*/ +/* Only evaluate TIF_SPEC_IB if conditional STIBP is enabled. */ if (IS_ENABLED (CONFIG_SMP ) &&static_branch_unlikely (&switch_to_cond_stibp)) { updmsr |= !!(tif_diff & _TIF_SPEC_IB);
arch/x86/kernel/reboot.c +8 -0
@@ -197,6 +197,14 @@ static const struct dmi_system_id reboot_dmi_table[] __initconst = { DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5"), }, }, + { /* Handle problems with rebooting on Apple MacBook6,1 */ + .callback = set_pci_reboot, + .ident = "Apple MacBook6,1", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Apple Inc." ), + DMI_MATCH(DMI_PRODUCT_NAME, "MacBook6,1"), + }, + }, { /* Handle problems with rebooting on Apple MacBookPro5 */ .callback = set_pci_reboot, .ident = "Apple MacBookPro5",
arch/x86/kernel/time.c +0 -4
@@ -25,10 +25,6 @@#include <asm/hpet.h> #include <asm/time.h> -#ifdef CONFIG_X86_64 -__visible volatile unsigned long jiffies __cacheline_aligned_in_smp = INITIAL_JIFFIES; -#endif -unsigned long profile_pc (struct pt_regs *regs) {unsigned long pc =instruction_pointer (regs);
arch/x86/kernel/vmlinux.lds.S +2 -2
@@ -36,13 +36,13 @@ OUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT) #ifdef CONFIG_X86_32 OUTPUT_ARCH(i386) ENTRY(phys_startup_32) -jiffies = jiffies_64; #else OUTPUT_ARCH(i386:x86-64) ENTRY(phys_startup_64) -jiffies_64 = jiffies; #endif +jiffies = jiffies_64; + #if defined(CONFIG_X86_64) /* * On 64-bit, align RODATA to 2MB so we retain large page mappings for
arch/x86/kvm/mmu.c +19 -27
66 lines not on this page · raw message
arch/x86/kvm/svm.c +3 -3
@@ -3237,8 +3237,8 @@ static int nested_svm_exit_special(struct vcpu_svm *svm)return NESTED_EXIT_HOST ;break ;case SVM_EXIT_EXCP_BASE +PF_VECTOR : -/* When we're shadowing, trap PFs, but not async PF */ -if (!npt_enabled && svm->vcpu.arch.apf.host_apf_reason ==0 ) +/* Trap async PF even if not shadowing */ +if (!npt_enabled || svm->vcpu.arch.apf.host_apf_reason)return NESTED_EXIT_HOST ;break ;default :
@@ -3327,7 +3327,7 @@ static inline void copy_vmcb_control_area(struct vmcb *dst_vmcb, struct vmcb *fr dst->iopm_base_pa = from->iopm_base_pa; dst->msrpm_base_pa = from->msrpm_base_pa; dst->tsc_offset = from->tsc_offset; - dst->asid = from->asid; +/* asid not copied, it is handled manually for svm->vmcb. */ dst->tlb_ctl = from->tlb_ctl; dst->int_ctl = from->int_ctl; dst->int_vector = from->int_vector;
arch/x86/kvm/vmx/nested.c +2 -2
@@ -302,7 +302,7 @@ static void vmx_switch_vmcs(struct kvm_vcpu *vcpu, struct loaded_vmcs *vmcs) cpu =get_cpu (); prev = vmx->loaded_vmcs; vmx->loaded_vmcs = vmcs; -vmx_vcpu_load_vmcs (vcpu, cpu); +vmx_vcpu_load_vmcs (vcpu, cpu, prev);vmx_sync_vmcs_host_state (vmx, prev);put_cpu ();
@@ -5357,7 +5357,7 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)vmcs_read32 (VM_EXIT_INTR_ERROR_CODE ), KVM_ISA_VMX); -switch (exit_reason) { +switch ((u16 )exit_reason) {case EXIT_REASON_EXCEPTION_NMI :if (is_nmi (intr_info))return false;
arch/x86/kvm/vmx/vmx.c +14 -4
@@ -1286,10 +1286,12 @@ static void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu)pi_set_on (pi_desc); } -void vmx_vcpu_load_vmcs (struct kvm_vcpu *vcpu,int cpu) +void vmx_vcpu_load_vmcs (struct kvm_vcpu *vcpu,int cpu, +struct loaded_vmcs *buddy) {struct vcpu_vmx *vmx =to_vmx (vcpu);bool already_loaded = vmx->loaded_vmcs->cpu == cpu; +struct vmcs *prev;if (!already_loaded) {loaded_vmcs_clear (vmx->loaded_vmcs);
@@ -1308,10 +1310,18 @@ void vmx_vcpu_load_vmcs(struct kvm_vcpu *vcpu, int cpu)local_irq_enable (); } -if (per_cpu (current_vmcs, cpu) != vmx->loaded_vmcs->vmcs) { + prev =per_cpu (current_vmcs, cpu); +if (prev != vmx->loaded_vmcs->vmcs) {per_cpu (current_vmcs, cpu) = vmx->loaded_vmcs->vmcs;vmcs_load (vmx->loaded_vmcs->vmcs); -indirect_branch_prediction_barrier (); + +/* +* No indirect branch prediction barrier needed when switching +* the active VMCS within a guest, e.g. on nested VM-Enter. +* The L1 VMM can protect itself with retpolines, IBPB or IBRS. +*/ +if (!buddy ||WARN_ON_ONCE (buddy->vmcs != prev)) +indirect_branch_prediction_barrier (); }if (!already_loaded) {
@@ -1356,7 +1366,7 @@ void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu) {struct vcpu_vmx *vmx =to_vmx (vcpu); -vmx_vcpu_load_vmcs (vcpu, cpu); +vmx_vcpu_load_vmcs (vcpu, cpu,NULL );vmx_vcpu_pi_load (vcpu, cpu);
arch/x86/kvm/vmx/vmx.h +2 -1
@@ -304,7 +304,8 @@ struct kvm_vmx { };bool nested_vmx_allowed (struct kvm_vcpu *vcpu); -void vmx_vcpu_load_vmcs (struct kvm_vcpu *vcpu,int cpu); +void vmx_vcpu_load_vmcs (struct kvm_vcpu *vcpu,int cpu, +struct loaded_vmcs *buddy);void vmx_vcpu_load (struct kvm_vcpu *vcpu,int cpu);int allocate_vpid (void );void free_vpid (int vpid);
arch/x86/kvm/x86.c +3 -6
@@ -6833,7 +6833,7 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,if (!ctxt->have_exception ||exception_type (ctxt->exception.vector) ==EXCPT_TRAP ) {kvm_rip_write (vcpu, ctxt->eip); -if (r && ctxt->tf) +if (r && (ctxt->tf || (vcpu->guest_debug &KVM_GUESTDBG_SINGLESTEP ))) r =kvm_vcpu_do_singlestep (vcpu);__kvm_set_rflags (vcpu, ctxt->eflags); }
@@ -7978,9 +7978,8 @@ static void vcpu_load_eoi_exitmap(struct kvm_vcpu *vcpu) kvm_x86_ops->load_eoi_exitmap (vcpu, eoi_exit_bitmap); } -int kvm_arch_mmu_notifier_invalidate_range (struct kvm *kvm, -unsigned long start,unsigned long end, -bool blockable) +void kvm_arch_mmu_notifier_invalidate_range (struct kvm *kvm, +unsigned long start,unsigned long end) {unsigned long apic_address;
@@ -7991,8 +7990,6 @@ int kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, apic_address =gfn_to_hva (kvm,APIC_DEFAULT_PHYS_BASE >>PAGE_SHIFT );if (start <= apic_address && apic_address < end)kvm_make_all_cpus_request (kvm,KVM_REQ_APIC_PAGE_RELOAD ); - -return 0 ; }void kvm_vcpu_reload_apic_access_page (struct kvm_vcpu *vcpu)
arch/x86/pci/fixup.c +4 -0
@@ -572,6 +572,10 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2fc0, pci_invalid_bar);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0x6f60 , pci_invalid_bar);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0x6fa0 , pci_invalid_bar);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0x6fc0 , pci_invalid_bar); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0xa1ec , pci_invalid_bar); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0xa1ed , pci_invalid_bar); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0xa26c , pci_invalid_bar); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0xa26d , pci_invalid_bar);/* * Device [1022:7808]
crypto/algapi.c +1 -1
@@ -374,7 +374,7 @@ static void crypto_wait_for_test(struct crypto_larval *larval) err =wait_for_completion_killable (&larval->completion);WARN_ON (err);if (!err) -crypto_probing_notify (CRYPTO_MSG_ALG_LOADED , larval); +crypto_notify (CRYPTO_MSG_ALG_LOADED , larval); out:crypto_larval_kill (&larval->alg);
crypto/drbg.c +3 -1
@@ -1294,8 +1294,10 @@ static inline int drbg_alloc_state(struct drbg_state *drbg)if (IS_ENABLED (CONFIG_CRYPTO_FIPS )) { drbg->prev =kzalloc (drbg_sec_strength (drbg->core->flags),GFP_KERNEL ); -if (!drbg->prev) +if (!drbg->prev) { + ret = -ENOMEM ; goto fini; + } drbg->fips_primed = false; }
drivers/acpi/cppc_acpi.c +1 -0
@@ -865,6 +865,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) "acpi_cppc");if (ret) {per_cpu (cpc_desc_ptr, pr->id) =NULL ; +kobject_put (&cpc_ptr->kobj); goto out_free; }
drivers/acpi/device_pm.c +1 -1
@@ -186,7 +186,7 @@ int acpi_device_set_power(struct acpi_device *device, int state)* possibly drop references to the power resources in use. */ state =ACPI_STATE_D3_HOT ; -/* If _PR3 is not available, use D3hot as the target state. */ +/* If D3cold is not supported, use D3hot as the target state. */ if (!device->power.states[ACPI_STATE_D3_COLD ].flags.valid) target_state = state; }else if (!device->power.states[state].flags.valid) {
drivers/acpi/evged.c +19 -3
@@ -79,6 +79,8 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,struct resource r;struct acpi_resource_irq *p = &ares->data.irq;struct acpi_resource_extended_irq *pext = &ares->data.extended_irq; +char ev_name[5 ]; +u8 trigger;if (ares->type ==ACPI_RESOURCE_TYPE_END_TAG )return AE_OK ;
@@ -87,14 +89,28 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,dev_err (dev,"unable to parse IRQ resource\n" );return AE_ERROR ; } -if (ares->type ==ACPI_RESOURCE_TYPE_IRQ ) +if (ares->type ==ACPI_RESOURCE_TYPE_IRQ ) { gsi = p->interrupts[0 ]; -else + trigger = p->triggering; + }else { gsi = pext->interrupts[0 ]; + trigger = p->triggering; + } irq = r.start; -if (ACPI_FAILURE (acpi_get_handle (handle,"_EVT" , &evt_handle))) { +switch (gsi) { + case 0 ... 255: +sprintf (ev_name,"_%c%02hhX" , + trigger ==ACPI_EDGE_SENSITIVE ?'E' :'L' , gsi); + +if (ACPI_SUCCESS (acpi_get_handle (handle, ev_name, &evt_handle))) +break ; +/* fall through */ +default : +if (ACPI_SUCCESS (acpi_get_handle (handle,"_EVT" , &evt_handle))) +break ; +dev_err (dev,"cannot locate _EVT method\n" );return AE_ERROR ; }
drivers/acpi/scan.c +19 -9
@@ -919,12 +919,9 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)if (buffer.length && package && package->type ==ACPI_TYPE_PACKAGE - && package->package.count) { -int err =acpi_extract_power_resources (package,0 , - &ps->resources); -if (!err) - device->power.flags.power_resources =1 ; - } + && package->package.count) +acpi_extract_power_resources (package,0 , &ps->resources); +ACPI_FREE (buffer.pointer); }
@@ -971,14 +968,27 @@ static void acpi_bus_get_power_flags(struct acpi_device *device)acpi_bus_init_power_state (device, i);INIT_LIST_HEAD (&device->power.states[ACPI_STATE_D3_COLD ].resources); -if (!list_empty (&device->power.states[ACPI_STATE_D3_HOT ].resources)) - device->power.states[ACPI_STATE_D3_COLD ].flags.valid =1 ; -/* Set defaults for D0 and D3hot states (always valid) */ +/* Set the defaults for D0 and D3hot (always supported). */ device->power.states[ACPI_STATE_D0 ].flags.valid =1 ; device->power.states[ACPI_STATE_D0 ].power =100 ; device->power.states[ACPI_STATE_D3_HOT ].flags.valid =1 ; +/* +* Use power resources only if the D0 list of them is populated, because +* some platforms may provide _PR3 only to indicate D3cold support and +* in those cases the power resources list returned by it may be bogus. +*/ +if (!list_empty (&device->power.states[ACPI_STATE_D0 ].resources)) { + device->power.flags.power_resources =1 ; +/* +* D3cold is supported if the D3hot list of power resources is +* not empty. +*/ +if (!list_empty (&device->power.states[ACPI_STATE_D3_HOT ].resources)) + device->power.states[ACPI_STATE_D3_COLD ].flags.valid =1 ; + } +if (acpi_bus_init_power (device)) device->flags.power_manageable =0 ; }
drivers/acpi/sysfs.c +3 -1
@@ -993,8 +993,10 @@ void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug, error =kobject_init_and_add (&hotplug->kobj, &acpi_hotplug_profile_ktype, hotplug_kobj,"%s" , name); -if (error) +if (error) { +kobject_put (&hotplug->kobj); goto err_out; + }kobject_uevent (&hotplug->kobj,KOBJ_ADD );return ;
drivers/block/floppy.c +5 -5
@@ -2902,17 +2902,17 @@ static blk_status_t floppy_queue_rq(struct blk_mq_hw_ctx *hctx, (unsigned long long) current_req->cmd_flags))return BLK_STS_IOERR ; -spin_lock_irq (&floppy_lock); -list_add_tail (&bd->rq->queuelist, &floppy_reqs); -spin_unlock_irq (&floppy_lock); -if (test_and_set_bit (0 , &fdc_busy)) {/* fdc busy, this new request will be treated when the current one is done */ is_alive (__func__,"old request running" ); -return BLK_STS_OK ; +return BLK_STS_RESOURCE ; } +spin_lock_irq (&floppy_lock); +list_add_tail (&bd->rq->queuelist, &floppy_reqs); +spin_unlock_irq (&floppy_lock); + command_status =FD_COMMAND_NONE ;__reschedule_timeout (MAXTIMEOUT ,"fd_request" );set_fdc (0 );
drivers/char/agp/intel-gtt.c +3 -1
@@ -846,6 +846,7 @@ void intel_gtt_insert_page(dma_addr_t addr, unsigned int flags) { intel_private.driver->write_entry (addr, pg, flags); +readl (intel_private.gtt + pg);if (intel_private.driver->chipset_flush) intel_private.driver->chipset_flush (); }
@@ -871,7 +872,7 @@ void intel_gtt_insert_sg_entries(struct sg_table *st, j++; } } -wmb (); +readl (intel_private.gtt + j -1 );if (intel_private.driver->chipset_flush) intel_private.driver->chipset_flush (); }
@@ -1105,6 +1106,7 @@ static void i9xx_cleanup(void)static void i9xx_chipset_flush (void ) { +wmb ();if (intel_private.i9xx_flush_page)writel (1 , intel_private.i9xx_flush_page); }
drivers/clk/clk.c +5 -1
@@ -114,7 +114,11 @@ static int clk_pm_runtime_get(struct clk_core *core)return 0 ; ret =pm_runtime_get_sync (core->dev); -return ret <0 ? ret :0 ; +if (ret <0 ) { +pm_runtime_put_noidle (core->dev); +return ret; + } +return 0 ; }static void clk_pm_runtime_put (struct clk_core *core)
drivers/cpufreq/cpufreq.c +6 -5
@@ -2507,26 +2507,27 @@ EXPORT_SYMBOL_GPL(cpufreq_update_limits);static int cpufreq_boost_set_sw (int state) {struct cpufreq_policy *policy; -int ret = -EINVAL ;for_each_active_policy (policy) { +int ret; +if (!policy->freq_table) -continue ; +return -ENXIO ; ret =cpufreq_frequency_table_cpuinfo (policy, policy->freq_table);if (ret) {pr_err ("%s: Policy frequency update failed\n" , __func__); -break ; +return ret; } ret =freq_qos_update_request (policy->max_freq_req, policy->max);if (ret <0 ) -break ; +return ret; } -return ret; +return 0 ; }int cpufreq_boost_trigger_state (int state)
drivers/crypto/cavium/nitrox/nitrox_main.c +2 -2
@@ -278,7 +278,7 @@ static void nitrox_remove_from_devlist(struct nitrox_device *ndev)struct nitrox_device *nitrox_get_first_device (void ) { -struct nitrox_device *ndev =NULL ; +struct nitrox_device *ndev;mutex_lock (&devlist_lock);list_for_each_entry (ndev, &ndevlist, list) {
@@ -286,7 +286,7 @@ struct nitrox_device *nitrox_get_first_device(void)break ; }mutex_unlock (&devlist_lock); -if (!ndev) +if (&ndev->list == &ndevlist)return NULL ;refcount_inc (&ndev->refcnt);
drivers/crypto/virtio/virtio_crypto_algs.c +14 -7
@@ -353,13 +353,18 @@ __virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req,int err;unsigned long flags;struct scatterlist outhdr, iv_sg, status_sg, **sgs; -int i;u64 dst_len;unsigned int num_out =0 , num_in =0 ;int sg_total;uint8_t *iv; +struct scatterlist *sg; src_nents =sg_nents_for_len (req->src, req->nbytes); +if (src_nents <0 ) { +pr_err ("Invalid number of src SG.\n" ); +return src_nents; + } + dst_nents =sg_nents (req->dst); pr_debug("virtio_crypto: Number of sgs (src_nents: %d, dst_nents: %d)\n",
@@ -405,6 +410,7 @@ __virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req, goto free; } + dst_len = min_t(unsigned int, req->nbytes, dst_len);pr_debug ("virtio_crypto: src_len: %u, dst_len: %llu\n" , req->nbytes, dst_len);
@@ -445,12 +451,12 @@ __virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req, vc_sym_req->iv = iv;/* Source data */ -for (i =0 ; i < src_nents; i++) - sgs[num_out++] = &req->src[i]; +for (sg = req->src; src_nents; sg =sg_next (sg), src_nents--) + sgs[num_out++] = sg;/* Destination data */ -for (i =0 ; i < dst_nents; i++) - sgs[num_out + num_in++] = &req->dst[i]; +for (sg = req->dst; sg; sg =sg_next (sg)) + sgs[num_out + num_in++] = sg;/* Status */ sg_init_one (&status_sg, &vc_req->status,sizeof (vc_req->status));
@@ -580,10 +586,11 @@ static void virtio_crypto_ablkcipher_finalize_req(scatterwalk_map_and_copy (req->info, req->dst, req->nbytes -AES_BLOCK_SIZE ,AES_BLOCK_SIZE ,0 ); -crypto_finalize_ablkcipher_request (vc_sym_req->base.dataq->engine, - req, err);kzfree (vc_sym_req->iv);virtcrypto_clear_request (&vc_sym_req->base); + +crypto_finalize_ablkcipher_request (vc_sym_req->base.dataq->engine, + req, err); }static struct virtio_crypto_algo virtio_crypto_algs[] = { {
drivers/edac/i10nm_base.c +1 -1
@@ -162,7 +162,7 @@ static int i10nm_get_dimm_config(struct mem_ctl_info *mci) mtr, mcddrtcfg, imc->mc, i, j);if (IS_DIMM_PRESENT (mtr)) - ndimms +=skx_get_dimm_info (mtr,0 , dimm, + ndimms +=skx_get_dimm_info (mtr,0 ,0 , dimm, imc, i, j);else if (IS_NVDIMM_PRESENT (mcddrtcfg, j)) ndimms += skx_get_nvdimm_info(dimm, imc, i, j,
drivers/edac/skx_base.c +8 -12
@@ -151,27 +151,23 @@ static const struct x86_cpu_id skx_cpuids[] = { };MODULE_DEVICE_TABLE (x86cpu, skx_cpuids); -#define SKX_GET_MTMTR (dev, reg) \ - pci_read_config_dword((dev), 0x87c, &(reg)) - -static bool skx_check_ecc (struct pci_dev *pdev) +static bool skx_check_ecc (u32 mcmtr) { -u32 mtmtr; - -SKX_GET_MTMTR (pdev, mtmtr); - -return !!GET_BITFIELD (mtmtr,2 ,2 ); +return !!GET_BITFIELD (mcmtr,2 ,2 ); }static int skx_get_dimm_config (struct mem_ctl_info *mci) {struct skx_pvt *pvt = mci->pvt_info; +u32 mtr, mcmtr, amap, mcddrtcfg;struct skx_imc *imc = pvt->imc; -u32 mtr, amap, mcddrtcfg;struct dimm_info *dimm;int i, j;int ndimms; +/* Only the mcmtr on the first channel is effective */ +pci_read_config_dword (imc->chan[0 ].cdev,0x87c , &mcmtr); +for (i =0 ; i <SKX_NUM_CHANNELS ; i++) { ndimms =0 ;pci_read_config_dword (imc->chan[i].cdev,0x8C , &amap);
@@ -182,14 +178,14 @@ static int skx_get_dimm_config(struct mem_ctl_info *mci)pci_read_config_dword (imc->chan[i].cdev,0x80 +4 * j, &mtr);if (IS_DIMM_PRESENT (mtr)) { - ndimms +=skx_get_dimm_info (mtr, amap, dimm, imc, i, j); + ndimms +=skx_get_dimm_info (mtr, mcmtr, amap, dimm, imc, i, j); }else if (IS_NVDIMM_PRESENT (mcddrtcfg, j)) { ndimms +=skx_get_nvdimm_info (dimm, imc, i, j,EDAC_MOD_STR ); nvdimm_count++; } } -if (ndimms && !skx_check_ecc (imc->chan[0 ].cdev)) { +if (ndimms && !skx_check_ecc (mcmtr)) {skx_printk (KERN_ERR ,"ECC is disabled on imc %d\n" , imc->mc);return -ENODEV ; }
drivers/edac/skx_common.c +3 -3
@@ -283,7 +283,7 @@ static int skx_get_dimm_attr(u32 reg, int lobit, int hibit, int add,#define numrow (reg) skx_get_dimm_attr(reg, 2, 4, 12, 1, 6, "rows")#define numcol (reg) skx_get_dimm_attr(reg, 0, 1, 10, 0, 2, "cols") -int skx_get_dimm_info (u32 mtr,u32 amap,struct dimm_info *dimm, +int skx_get_dimm_info (u32 mtr,u32 mcmtr,u32 amap,struct dimm_info *dimm,struct skx_imc *imc,int chan,int dimmno) {int banks =16 , ranks, rows, cols, npages;
@@ -303,8 +303,8 @@ int skx_get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm, imc->mc, chan, dimmno, size, npages, banks, 1 << ranks, rows, cols); - imc->chan[chan].dimms[dimmno].close_pg =GET_BITFIELD (mtr,0 ,0 ); - imc->chan[chan].dimms[dimmno].bank_xor_enable =GET_BITFIELD (mtr,9 ,9 ); + imc->chan[chan].dimms[dimmno].close_pg =GET_BITFIELD (mcmtr,0 ,0 ); + imc->chan[chan].dimms[dimmno].bank_xor_enable =GET_BITFIELD (mcmtr,9 ,9 ); imc->chan[chan].dimms[dimmno].fine_grain_bank =GET_BITFIELD (amap,0 ,0 ); imc->chan[chan].dimms[dimmno].rowbits = rows; imc->chan[chan].dimms[dimmno].colbits = cols;
drivers/edac/skx_common.h +1 -1
@@ -126,7 +126,7 @@ int skx_get_all_bus_mappings(unsigned int did, int off, enum type,int skx_get_hi_lo (unsigned int did,int off[],u64 *tolm,u64 *tohm); -int skx_get_dimm_info (u32 mtr,u32 amap,struct dimm_info *dimm, +int skx_get_dimm_info (u32 mtr,u32 mcmtr,u32 amap,struct dimm_info *dimm,struct skx_imc *imc,int chan,int dimmno); int skx_get_nvdimm_info(struct dimm_info *dimm, struct skx_imc *imc,
drivers/firmware/efi/efivars.c +3 -1
@@ -522,8 +522,10 @@ efivar_create_sysfs_entry(struct efivar_entry *new_var) ret =kobject_init_and_add (&new_var->kobj, &efivar_ktype,NULL ,"%s" , short_name);kfree (short_name); -if (ret) +if (ret) { +kobject_put (&new_var->kobj);return ret; + }kobject_uevent (&new_var->kobj,KOBJ_ADD );if (efivar_entry_add (new_var, &efivar_sysfs_list)) {
drivers/firmware/imx/imx-scu.c +56 -16
139 lines not on this page · raw message
drivers/gpu/drm/i915/gem/i915_gem_userptr.c +8 -0
@@ -619,6 +619,14 @@ static int i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN); +/* +* Using __get_user_pages_fast() with a read-only +* access is questionable. A read-only page may be +* COW-broken, and then this might end up giving +* the wrong side of the COW.. +* +* We may or may not care. +*/ if (pvec)/* defer to worker if malloc fails */ pinned = __get_user_pages_fast(obj->userptr.ptr, num_pages,
drivers/gpu/drm/vkms/vkms_drv.h +0 -5
@@ -121,11 +121,6 @@ struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev, enum drm_plane_type type, int index);/* Gem stuff */ -struct drm_gem_object *vkms_gem_create (struct drm_device *dev, -struct drm_file *file, -u32 *handle, -u64 size); -vm_fault_t vkms_gem_fault (struct vm_fault *vmf); int vkms_dumb_create(struct drm_file *file, struct drm_device *dev,
drivers/gpu/drm/vkms/vkms_gem.c +6 -5
@@ -95,10 +95,10 @@ vm_fault_t vkms_gem_fault(struct vm_fault *vmf)return ret; } -struct drm_gem_object *vkms_gem_create (struct drm_device *dev, -struct drm_file *file, -u32 *handle, -u64 size) +static struct drm_gem_object *vkms_gem_create (struct drm_device *dev, +struct drm_file *file, +u32 *handle, +u64 size) {struct vkms_gem_object *obj;int ret;
@@ -111,7 +111,6 @@ struct drm_gem_object *vkms_gem_create(struct drm_device *dev,return ERR_CAST (obj); ret =drm_gem_handle_create (file, &obj->gem, handle); -drm_gem_object_put_unlocked (&obj->gem);if (ret)return ERR_PTR (ret);
@@ -140,6 +139,8 @@ int vkms_dumb_create(struct drm_file *file, struct drm_device *dev, args->size = gem_obj->size; args->pitch = pitch; +drm_gem_object_put_unlocked (gem_obj); +DRM_DEBUG_DRIVER ("Created object of size %lld\n" , size);return 0 ;
drivers/infiniband/core/uverbs_main.c +2 -0
@@ -307,6 +307,8 @@ static __poll_t ib_uverbs_event_poll(struct ib_uverbs_event_queue *ev_queue,spin_lock_irq (&ev_queue->lock);if (!list_empty (&ev_queue->event_list)) pollflags =EPOLLIN |EPOLLRDNORM ; +else if (ev_queue->is_closed) + pollflags =EPOLLERR ;spin_unlock_irq (&ev_queue->lock);return pollflags;
drivers/input/mouse/synaptics.c +1 -0
@@ -170,6 +170,7 @@ static const char * const smbus_pnp_ids[] = {"LEN005b" ,/* P50 */ "LEN005e" ,/* T560 */ "LEN006c" ,/* T470s */ +"LEN007a" ,/* T470s */ "LEN0071" ,/* T480 */ "LEN0072" ,/* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */ "LEN0073", /* X1 Carbon G5 (Elantech) */
drivers/input/touchscreen/mms114.c +5 -7
@@ -91,15 +91,15 @@ static int __mms114_read_reg(struct mms114_data *data, unsigned int reg,if (reg <=MMS114_MODE_CONTROL && reg + len >MMS114_MODE_CONTROL )BUG (); -/* Write register: use repeated start */ +/* Write register */ xfer[0 ].addr = client->addr; - xfer[0 ].flags =I2C_M_TEN |I2C_M_NOSTART ; + xfer[0 ].flags = client->flags &I2C_M_TEN ; xfer[0 ].len =1 ; xfer[0 ].buf = &buf;/* Read data */ xfer[1 ].addr = client->addr; - xfer[1 ].flags =I2C_M_RD ; + xfer[1 ].flags = (client->flags &I2C_M_TEN ) |I2C_M_RD ; xfer[1 ].len = len; xfer[1 ].buf = val;
@@ -428,10 +428,8 @@ static int mms114_probe(struct i2c_client *client,const void *match_data;int error; -if (!i2c_check_functionality (client->adapter, -I2C_FUNC_PROTOCOL_MANGLING )) { -dev_err (&client->dev, -"Need i2c bus that supports protocol mangling\n" ); +if (!i2c_check_functionality (client->adapter,I2C_FUNC_I2C )) { +dev_err (&client->dev,"Not supported I2C adapter\n" );return -ENODEV ; }
drivers/mmc/core/sdio.c +28 -33
126 lines not on this page · raw message
drivers/mmc/host/mmci_stm32_sdmmc.c +3 -0
@@ -162,6 +162,9 @@ static int sdmmc_idma_start(struct mmci_host *host, unsigned int *datactrl)static void sdmmc_idma_finalize (struct mmci_host *host,struct mmc_data *data) {writel_relaxed (0 , host->base +MMCI_STM32_IDMACTRLR ); + +if (!data->host_cookie) +sdmmc_idma_unprep_data (host, data,0 ); }static void mmci_sdmmc_set_clkreg (struct mmci_host *host,unsigned int desired)
drivers/mmc/host/sdhci-msm.c +6 -0
@@ -1112,6 +1112,12 @@ static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode)/* Clock-Data-Recovery used to dynamically adjust RX sampling point */ msm_host->use_cdr = true; +/* +* Clear tuning_done flag before tuning to ensure proper +* HS400 settings. +*/ + msm_host->tuning_done =0 ; +/* * For HS400 tuning in HS200 timing requires: * - select MCLK/2 in VENDOR_SPEC
drivers/mmc/host/tmio_mmc_core.c +4 -2
@@ -1285,12 +1285,14 @@ void tmio_mmc_host_remove(struct tmio_mmc_host *host)cancel_work_sync (&host->done);cancel_delayed_work_sync (&host->delayed_reset_work);tmio_mmc_release_dma (host); +tmio_mmc_disable_mmc_irqs (host,TMIO_MASK_ALL ); -pm_runtime_dont_use_autosuspend (&pdev->dev);if (host->native_hotplug)pm_runtime_put_noidle (&pdev->dev); -pm_runtime_put_sync (&pdev->dev); +pm_runtime_disable (&pdev->dev); +pm_runtime_dont_use_autosuspend (&pdev->dev); +pm_runtime_put_noidle (&pdev->dev); }EXPORT_SYMBOL_GPL (tmio_mmc_host_remove);
drivers/mmc/host/uniphier-sd.c +7 -5
@@ -614,11 +614,6 @@ static int uniphier_sd_probe(struct platform_device *pdev) } } - ret =devm_request_irq (dev, irq, tmio_mmc_irq,IRQF_SHARED , -dev_name (dev), host); -if (ret) - goto free_host; -if (priv->caps &UNIPHIER_SD_CAP_EXTENDED_IP ) host->dma_ops = &uniphier_sd_internal_dma_ops;else
@@ -646,8 +641,15 @@ static int uniphier_sd_probe(struct platform_device *pdev)if (ret) goto free_host; + ret =devm_request_irq (dev, irq, tmio_mmc_irq,IRQF_SHARED , +dev_name (dev), host); +if (ret) + goto remove_host; +return 0 ; +remove_host: +tmio_mmc_host_remove (host); free_host:tmio_mmc_host_free (host);
drivers/net/ethernet/ibm/ibmvnic.c +3 -5
@@ -4536,12 +4536,10 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,dev_err (dev,"Error %ld in VERSION_EXCHG_RSP\n" , rc);break ; } -dev_info (dev,"Partner protocol version is %d\n" , - crq->version_exchange_rsp.version); -if (be16_to_cpu (crq->version_exchange_rsp.version) < - ibmvnic_version) - ibmvnic_version = + ibmvnic_version =be16_to_cpu (crq->version_exchange_rsp.version); +dev_info (dev,"Partner protocol version is %d\n" , + ibmvnic_version);send_cap_queries (adapter);break ;case QUERY_CAPABILITY_RSP :
drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c +4 -0
@@ -152,6 +152,10 @@ void mlx5e_close_xsk(struct mlx5e_channel *c)mlx5e_close_cq (&c->xskicosq.cq);mlx5e_close_xdpsq (&c->xsksq);mlx5e_close_cq (&c->xsksq.cq); + +memset (&c->xskrq,0 ,sizeof (c->xskrq)); +memset (&c->xsksq,0 ,sizeof (c->xsksq)); +memset (&c->xskicosq,0 ,sizeof (c->xskicosq)); }void mlx5e_activate_xsk (struct mlx5e_channel *c)
drivers/net/ethernet/mellanox/mlx5/core/health.c +11 -3
@@ -193,15 +193,23 @@ static bool reset_fw_if_needed(struct mlx5_core_dev *dev)void mlx5_enter_error_state (struct mlx5_core_dev *dev,bool force) { +bool err_detected = false; + +/* Mark the device as fatal in order to abort FW commands */ +if ((check_fatal_sensors (dev) || force) && + dev->state ==MLX5_DEVICE_STATE_UP ) { + dev->state =MLX5_DEVICE_STATE_INTERNAL_ERROR ; + err_detected = true; + }mutex_lock (&dev->intf_state_mutex); -if (dev->state ==MLX5_DEVICE_STATE_INTERNAL_ERROR ) - goto unlock; +if (!err_detected && dev->state ==MLX5_DEVICE_STATE_INTERNAL_ERROR ) + goto unlock;/* a previous error is still being handled */ if (dev->state ==MLX5_DEVICE_STATE_UNINITIALIZED ) { dev->state =MLX5_DEVICE_STATE_INTERNAL_ERROR ; goto unlock; } -if (check_fatal_sensors (dev) || force) { +if (check_fatal_sensors (dev) || force) {/* protected state setting */ dev->state =MLX5_DEVICE_STATE_INTERNAL_ERROR ;mlx5_cmd_flush (dev); }
drivers/net/ethernet/mellanox/mlx5/core/main.c +5 -0
@@ -794,6 +794,11 @@ static int mlx5_pci_init(struct mlx5_core_dev *dev, struct pci_dev *pdev,static void mlx5_pci_close (struct mlx5_core_dev *dev) { +/* health work might still be active, and it needs pci bar in +* order to know the NIC state. Therefore, drain the health WQ +* before removing the pci bars +*/ +mlx5_drain_health_wq (dev);iounmap (dev->iseg);pci_clear_master (dev->pdev);release_bar (dev->pdev);
drivers/net/ethernet/mellanox/mlxsw/core_thermal.c +19 -4
@@ -390,8 +390,7 @@ static int mlxsw_thermal_set_trip_hyst(struct thermal_zone_device *tzdev,static int mlxsw_thermal_trend_get (struct thermal_zone_device *tzdev,int trip,enum thermal_trend *trend) { -struct mlxsw_thermal_module *tz = tzdev->devdata; -struct mlxsw_thermal *thermal = tz->parent; +struct mlxsw_thermal *thermal = tzdev->devdata;if (trip <0 || trip >=MLXSW_THERMAL_NUM_TRIPS )return -EINVAL ;
@@ -592,6 +591,22 @@ mlxsw_thermal_module_trip_hyst_set(struct thermal_zone_device *tzdev, int trip,return 0 ; } +static int mlxsw_thermal_module_trend_get (struct thermal_zone_device *tzdev, +int trip,enum thermal_trend *trend) +{ +struct mlxsw_thermal_module *tz = tzdev->devdata; +struct mlxsw_thermal *thermal = tz->parent; + +if (trip <0 || trip >=MLXSW_THERMAL_NUM_TRIPS ) +return -EINVAL ; + +if (tzdev == thermal->tz_highest_dev) +return 1 ; + + *trend =THERMAL_TREND_STABLE ; +return 0 ; +} +static struct thermal_zone_device_ops mlxsw_thermal_module_ops = { .bind = mlxsw_thermal_module_bind, .unbind = mlxsw_thermal_module_unbind,
@@ -603,7 +618,7 @@ static struct thermal_zone_device_ops mlxsw_thermal_module_ops = { .set_trip_temp = mlxsw_thermal_module_trip_temp_set, .get_trip_hyst = mlxsw_thermal_module_trip_hyst_get, .set_trip_hyst = mlxsw_thermal_module_trip_hyst_set, - .get_trend = mlxsw_thermal_trend_get, + .get_trend = mlxsw_thermal_module_trend_get, }; static int mlxsw_thermal_gearbox_temp_get(struct thermal_zone_device *tzdev,
@@ -642,7 +657,7 @@ static struct thermal_zone_device_ops mlxsw_thermal_gearbox_ops = { .set_trip_temp = mlxsw_thermal_module_trip_temp_set, .get_trip_hyst = mlxsw_thermal_module_trip_hyst_get, .set_trip_hyst = mlxsw_thermal_module_trip_hyst_set, - .get_trend = mlxsw_thermal_trend_get, + .get_trend = mlxsw_thermal_module_trend_get, }; static int mlxsw_thermal_get_max_state(struct thermal_cooling_device *cdev,
drivers/net/net_failover.c +2 -1
@@ -61,7 +61,8 @@ static int net_failover_open(struct net_device *dev)return 0 ; err_standby_open: -dev_close (primary_dev); +if (primary_dev) +dev_close (primary_dev); err_primary_open:netif_tx_disable (dev);return err;
drivers/net/tun.c +10 -4
@@ -1908,8 +1908,11 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, skb->dev = tun->dev;break ;case IFF_TAP : -if (!frags) - skb->protocol =eth_type_trans (skb, tun->dev); +if (frags && !pskb_may_pull (skb,ETH_HLEN )) { + err = -ENOMEM ; + goto drop; + } + skb->protocol =eth_type_trans (skb, tun->dev);break ; }
@@ -1966,9 +1969,12 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, }if (frags) { +u32 headlen; +/* Exercise flow dissector code path. */ -u32 headlen =eth_get_headlen (tun->dev, skb->data, -skb_headlen (skb)); +skb_push (skb,ETH_HLEN ); + headlen =eth_get_headlen (tun->dev, skb->data, +skb_headlen (skb));if (unlikely (headlen >skb_headlen (skb))) {this_cpu_inc (tun->pcpu_stats->rx_dropped);
drivers/net/vxlan.c +4 -0
@@ -1924,6 +1924,10 @@ static struct sk_buff *vxlan_na_create(struct sk_buff *request, ns_olen = request->len -skb_network_offset (request) -sizeof (struct ipv6hdr ) -sizeof (*ns);for (i =0 ; i < ns_olen-1 ; i += (ns->opt[i+1 ]<<3 )) { +if (!ns->opt[i +1 ]) { +kfree_skb (reply); +return NULL ; + }if (ns->opt[i] ==ND_OPT_SOURCE_LL_ADDR ) { daddr = ns->opt + i +sizeof (struct nd_opt_hdr );break ;
drivers/net/wireless/ath/ath9k/hif_usb.c +45 -13
164 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/hif_usb.h +6 -0
@@ -86,6 +86,11 @@ struct tx_buf {struct list_head list; }; +struct rx_buf { +struct sk_buff *skb; +struct hif_device_usb *hif_dev; +}; +#define HIF_USB_TX_STOP BIT(0)#define HIF_USB_TX_FLUSH BIT(1)
@@ -133,5 +138,6 @@ struct hif_device_usb {int ath9k_hif_usb_init (void );void ath9k_hif_usb_exit (void ); +void ath9k_hif_usb_dealloc_urbs (struct hif_device_usb *hif_dev);#endif /* HTC_USB_H */
drivers/net/wireless/ath/ath9k/htc_drv_init.c +7 -3
@@ -931,8 +931,9 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv,int ath9k_htc_probe_device (struct htc_target *htc_handle,struct device *dev,u16 devid,char *product,u32 drv_info) { -struct ieee80211_hw *hw; +struct hif_device_usb *hif_dev;struct ath9k_htc_priv *priv; +struct ieee80211_hw *hw;int ret; hw =ieee80211_alloc_hw (sizeof (struct ath9k_htc_priv ), &ath9k_htc_ops);
@@ -967,7 +968,10 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,return 0 ; err_init: -ath9k_deinit_wmi (priv); +ath9k_stop_wmi (priv); + hif_dev = (struct hif_device_usb *)htc_handle->hif_dev; +ath9k_hif_usb_dealloc_urbs (hif_dev); +ath9k_destoy_wmi (priv); err_free:ieee80211_free_hw (hw);return ret;
@@ -982,7 +986,7 @@ void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug) htc_handle->drv_priv->ah->ah_flags |=AH_UNPLUGGED ;ath9k_deinit_device (htc_handle->drv_priv); -ath9k_deinit_wmi (htc_handle->drv_priv); +ath9k_stop_wmi (htc_handle->drv_priv);ieee80211_free_hw (htc_handle->drv_priv->hw); } }
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +3 -3
@@ -999,9 +999,9 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,* which are not PHY_ERROR (short radar pulses have a length of 3) */ if (unlikely (!rs_datalen || (rs_datalen <10 && !is_phyerr))) { -ath_warn (common, -"Short RX data len, dropping (dlen: %d)\n" , - rs_datalen); +ath_dbg (common,ANY , +"Short RX data len, dropping (dlen: %d)\n" , + rs_datalen); goto rx_next; }
drivers/net/wireless/ath/ath9k/htc_hst.c +3 -3
@@ -113,6 +113,9 @@ static void htc_process_conn_rsp(struct htc_target *target,if (svc_rspmsg->status ==HTC_SERVICE_SUCCESS ) { epid = svc_rspmsg->endpoint_id; +if (epid <0 || epid >=ENDPOINT_MAX ) +return ; + service_id =be16_to_cpu (svc_rspmsg->service_id); max_msglen =be16_to_cpu (svc_rspmsg->max_msg_len); endpoint = &target->endpoint[epid];
@@ -170,7 +173,6 @@ static int htc_config_pipe_credits(struct htc_target *target) time_left =wait_for_completion_timeout (&target->cmd_wait,HZ );if (!time_left) {dev_err (target->dev,"HTC credit config timeout\n" ); -kfree_skb (skb);return -ETIMEDOUT ; }
@@ -206,7 +208,6 @@ static int htc_setup_complete(struct htc_target *target) time_left =wait_for_completion_timeout (&target->cmd_wait,HZ );if (!time_left) {dev_err (target->dev,"HTC start timeout\n" ); -kfree_skb (skb);return -ETIMEDOUT ; }
@@ -279,7 +280,6 @@ int htc_connect_service(struct htc_target *target,if (!time_left) {dev_err (target->dev,"Service connection timeout for: %d\n" , service_connreq->service_id); -kfree_skb (skb);return -ETIMEDOUT ; }
drivers/net/wireless/ath/ath9k/wmi.c +4 -2
@@ -112,14 +112,17 @@ struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv)return wmi; } -void ath9k_deinit_wmi (struct ath9k_htc_priv *priv) +void ath9k_stop_wmi (struct ath9k_htc_priv *priv) {struct wmi *wmi = priv->wmi;mutex_lock (&wmi->op_mutex); wmi->stopped = true;mutex_unlock (&wmi->op_mutex); +} +void ath9k_destoy_wmi (struct ath9k_htc_priv *priv) +{kfree (priv->wmi); }
@@ -336,7 +339,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,ath_dbg (common,WMI ,"Timeout waiting for WMI command: %s\n" ,wmi_cmd_to_name (cmd_id));mutex_unlock (&wmi->op_mutex); -kfree_skb (skb);return -ETIMEDOUT ; }
drivers/net/wireless/ath/ath9k/wmi.h +2 -1
@@ -179,7 +179,6 @@ struct wmi { };struct wmi *ath9k_init_wmi (struct ath9k_htc_priv *priv); -void ath9k_deinit_wmi (struct ath9k_htc_priv *priv);int ath9k_wmi_connect (struct htc_target *htc,struct wmi *wmi,enum htc_endpoint_id *wmi_ctrl_epid); int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
@@ -189,6 +188,8 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,void ath9k_wmi_event_tasklet (unsigned long data);void ath9k_fatal_work (struct work_struct *work);void ath9k_wmi_event_drain (struct ath9k_htc_priv *priv); +void ath9k_stop_wmi (struct ath9k_htc_priv *priv); +void ath9k_destoy_wmi (struct ath9k_htc_priv *priv);#define WMI_CMD (_wmi_cmd) \ do { \
drivers/net/wireless/intel/iwlwifi/mvm/nvm.c +1 -1
@@ -281,7 +281,7 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)int regulatory_type;/* Checking for required sections */ -if (mvm->trans->cfg->nvm_type !=IWL_NVM_EXT ) { +if (mvm->trans->cfg->nvm_type ==IWL_NVM ) {if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW ].data || !mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data) {IWL_ERR (mvm,"Can't parse empty OTP/NVM sections\n" );
drivers/pci/pci.c +2 -2
@@ -4621,10 +4621,10 @@ static bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active,/* * Some controllers might not implement link active reporting. In this -* case, we wait for 1000 + 100 ms. +* case, we wait for 1000 ms + any delay requested by the caller. */ if (!pdev->link_active_reporting) { -msleep (1100 ); +msleep (timeout + delay);return true; }
drivers/remoteproc/remoteproc_core.c +1 -1
@@ -511,7 +511,7 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,/* Initialise vdev subdevice */ snprintf (name,sizeof (name),"vdev%dbuffer" , rvdev->index); - rvdev->dev.parent = rproc->dev.parent; + rvdev->dev.parent = &rproc->dev; rvdev->dev.dma_pfn_offset = rproc->dev.parent->dma_pfn_offset; rvdev->dev.release = rproc_rvdev_release;dev_set_name (&rvdev->dev,"%s#%s" ,dev_name (rvdev->dev.parent), name);
drivers/remoteproc/remoteproc_virtio.c +12 -0
@@ -375,6 +375,18 @@ int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id) goto out; } } + }else { +struct device_node *np = rproc->dev.parent->of_node; + +/* +* If we don't have dedicated buffer, just attempt to re-assign +* the reserved memory from our parent. A default memory-region +* at index 0 from the parent's memory-regions is assigned for +* the rvdev dev to allocate from. Failure is non-critical and +* the allocations will fall back to global pools, so don't +* check return value either. +*/ +of_reserved_mem_device_init_by_idx (dev, np,0 ); }/* Allocate virtio device */
drivers/scsi/lpfc/lpfc_ct.c +0 -1
@@ -462,7 +462,6 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)struct lpfc_nodelist *ndlp;if ((vport->port_type !=LPFC_NPIV_PORT ) || - (fc4_type ==FC_TYPE_FCP ) || !(vport->ct_flags &FC_CT_RFF_ID ) || !vport->cfg_restrict_login) { ndlp =lpfc_setup_disc_node (vport, Did);
drivers/scsi/megaraid/megaraid_sas_fusion.c +6 -1
@@ -4227,6 +4227,7 @@ static void megasas_refire_mgmt_cmd(struct megasas_instance *instance)struct fusion_context *fusion;struct megasas_cmd *cmd_mfi;union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc; +struct MPI2_RAID_SCSI_IO_REQUEST *scsi_io_req;u16 smid;bool refire_cmd =0 ;u8 result;
@@ -4284,6 +4285,11 @@ static void megasas_refire_mgmt_cmd(struct megasas_instance *instance)break ; } + scsi_io_req = (struct MPI2_RAID_SCSI_IO_REQUEST *) + cmd_fusion->io_request; +if (scsi_io_req->Function ==MPI2_FUNCTION_SCSI_TASK_MGMT ) + result =RETURN_CMD ; +switch (result) {case REFIRE_CMD :megasas_fire_cmd_fusion (instance, req_desc);
@@ -4481,7 +4487,6 @@ megasas_issue_tm(struct megasas_instance *instance, u16 device_handle,if (!timeleft) {dev_err (&instance->pdev->dev,"task mgmt type 0x%x timed out\n" , type); - cmd_mfi->flags |=DRV_DCMD_SKIP_REFIRE ;mutex_unlock (&instance->reset_mutex); rc =megasas_reset_fusion (instance->host,MFI_IO_TIMEOUT_OCR );mutex_lock (&instance->reset_mutex);
drivers/spi/spi-bcm-qspi.c +9 -11
@@ -670,7 +670,7 @@ static void read_from_hw(struct bcm_qspi *qspi, int slots)if (buf) buf[tp.byte] =read_rxram_slot_u8 (qspi, slot);dev_dbg (&qspi->pdev->dev,"RD %02x\n" , - buf ? buf[tp.byte] :0xff ); + buf ? buf[tp.byte] :0x0 ); }else {u16 *buf = tp.trans->rx_buf;
@@ -678,7 +678,7 @@ static void read_from_hw(struct bcm_qspi *qspi, int slots) buf[tp.byte /2 ] =read_rxram_slot_u16 (qspi, slot);dev_dbg (&qspi->pdev->dev,"RD %04x\n" , - buf ? buf[tp.byte] :0xffff ); + buf ? buf[tp.byte /2 ] :0x0 ); } update_qspi_trans_byte_count(qspi, &tp,
@@ -733,13 +733,13 @@ static int write_to_hw(struct bcm_qspi *qspi, struct spi_device *spi)while (!tstatus && slot <MSPI_NUM_CDRAM ) {if (tp.trans->bits_per_word <=8 ) {const u8 *buf = tp.trans->tx_buf; -u8 val = buf ? buf[tp.byte] :0xff ; +u8 val = buf ? buf[tp.byte] :0x00 ;write_txram_slot_u8 (qspi, slot, val);dev_dbg (&qspi->pdev->dev,"WR %02x\n" , val); }else {const u16 *buf = tp.trans->tx_buf; -u16 val = buf ? buf[tp.byte /2 ] :0xffff ; +u16 val = buf ? buf[tp.byte /2 ] :0x0000 ;write_txram_slot_u16 (qspi, slot, val);dev_dbg (&qspi->pdev->dev,"WR %04x\n" , val);
@@ -1220,6 +1220,11 @@ int bcm_qspi_probe(struct platform_device *pdev, } qspi =spi_master_get_devdata (master); + + qspi->clk =devm_clk_get_optional (&pdev->dev,NULL ); +if (IS_ERR (qspi->clk)) +return PTR_ERR (qspi->clk); + qspi->pdev = pdev; qspi->trans_pos.trans =NULL ; qspi->trans_pos.byte =0 ;
@@ -1332,13 +1337,6 @@ int bcm_qspi_probe(struct platform_device *pdev, qspi->soc_intc =NULL ; } - qspi->clk =devm_clk_get (&pdev->dev,NULL ); -if (IS_ERR (qspi->clk)) { -dev_warn (dev,"unable to get clock\n" ); - ret =PTR_ERR (qspi->clk); - goto qspi_probe_err; - } - ret =clk_prepare_enable (qspi->clk);if (ret) {dev_err (dev,"failed to prepare clock\n" );
drivers/spi/spi-bcm2835.c +3 -1
@@ -1330,7 +1330,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev) goto out_clk_disable; } - err =devm_spi_register_controller (&pdev->dev, ctlr); + err =spi_register_controller (ctlr);if (err) {dev_err (&pdev->dev,"could not register SPI controller: %d\n" , err);
@@ -1355,6 +1355,8 @@ static int bcm2835_spi_remove(struct platform_device *pdev)bcm2835_debugfs_remove (bs); +spi_unregister_controller (ctlr); +/* Clear FIFOs, and disable the HW block */ bcm2835_wr (bs,BCM2835_SPI_CS ,BCM2835_SPI_CS_CLEAR_RX |BCM2835_SPI_CS_CLEAR_TX );
drivers/spi/spi-bcm2835aux.c +3 -1
@@ -569,7 +569,7 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev) goto out_clk_disable; } - err =devm_spi_register_master (&pdev->dev, master); + err =spi_register_master (master);if (err) {dev_err (&pdev->dev,"could not register SPI master: %d\n" , err); goto out_clk_disable;
@@ -593,6 +593,8 @@ static int bcm2835aux_spi_remove(struct platform_device *pdev)bcm2835aux_debugfs_remove (bs); +spi_unregister_master (master); +bcm2835aux_spi_reset_hw (bs);/* disable the HW block by releasing the clock */
drivers/spi/spi-dw.c +12 -2
@@ -128,12 +128,20 @@ void dw_spi_set_cs(struct spi_device *spi, bool enable) {struct dw_spi *dws =spi_controller_get_devdata (spi->controller);struct chip_data *chip =spi_get_ctldata (spi); +bool cs_high = !!(spi->mode &SPI_CS_HIGH );/* Chip select logic is inverted from spi_set_cs() */ if (chip && chip->cs_control) chip->cs_control (!enable); -if (!enable) +/* +* DW SPI controller demands any native CS being set in order to +* proceed with data transfer. So in order to activate the SPI +* communications we must set a corresponding bit in the Slave +* Enable register no matter whether the SPI core is configured to +* support active-high or active-low CS level. +*/ +if (cs_high == enable)dw_writel (dws,DW_SPI_SER ,BIT (spi->chip_select));else if (dws->cs_override)dw_writel (dws,DW_SPI_SER ,0 );
@@ -524,7 +532,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) } } - ret =devm_spi_register_controller (dev, master); + ret =spi_register_controller (master);if (ret) {dev_err (&master->dev,"problem registering spi master\n" ); goto err_dma_exit;
@@ -548,6 +556,8 @@ void dw_spi_remove_host(struct dw_spi *dws) {dw_spi_debugfs_remove (dws); +spi_unregister_controller (dws->master); +if (dws->dma_ops && dws->dma_ops->dma_exit) dws->dma_ops->dma_exit (dws);
drivers/spi/spi-pxa2xx.c +3 -2
@@ -1880,7 +1880,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)/* Register with the SPI framework */ platform_set_drvdata (pdev, drv_data); - status =devm_spi_register_controller (&pdev->dev, controller); + status =spi_register_controller (controller);if (status !=0 ) {dev_err (&pdev->dev,"problem registering spi controller\n" ); goto out_error_pm_runtime_enabled;
@@ -1889,7 +1889,6 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)return status; out_error_pm_runtime_enabled: -pm_runtime_put_noidle (&pdev->dev);pm_runtime_disable (&pdev->dev); out_error_clock_enabled:
@@ -1916,6 +1915,8 @@ static int pxa2xx_spi_remove(struct platform_device *pdev)pm_runtime_get_sync (&pdev->dev); +spi_unregister_controller (drv_data->controller); +/* Disable the SSP at the peripheral and SOC level */ pxa2xx_spi_write (drv_data,SSCR0 ,0 );clk_disable_unprepare (ssp->clk);
drivers/spi/spi.c +2 -1
@@ -2581,6 +2581,8 @@ void spi_unregister_controller(struct spi_controller *ctlr)struct spi_controller *found;int id = ctlr->bus_num; +device_for_each_child (&ctlr->dev,NULL , __unregister); +/* First make sure that this controller was ever added */ mutex_lock (&board_lock); found =idr_find (&spi_master_idr, id);
@@ -2593,7 +2595,6 @@ void spi_unregister_controller(struct spi_controller *ctlr)list_del (&ctlr->list);mutex_unlock (&board_lock); -device_for_each_child (&ctlr->dev,NULL , __unregister);device_unregister (&ctlr->dev);/* free bus id */ mutex_lock (&board_lock);
drivers/video/fbdev/vt8500lcdfb.c +1 -0
@@ -230,6 +230,7 @@ static int vt8500lcd_blank(int blank, struct fb_info *info) info->fix.visual == FB_VISUAL_STATIC_PSEUDOCOLOR)for (i =0 ; i <256 ; i++)vt8500lcd_setcolreg (i,0 ,0 ,0 ,0 , info); + fallthrough;case FB_BLANK_UNBLANK :if (info->fix.visual ==FB_VISUAL_PSEUDOCOLOR || info->fix.visual ==FB_VISUAL_STATIC_PSEUDOCOLOR )
drivers/video/fbdev/w100fb.c +2 -0
@@ -588,6 +588,7 @@ static void w100fb_restore_vidmem(struct w100fb_par *par) memsize=par->mach->mem->size;memcpy_toio (remapped_fbuf + (W100_FB_BASE -MEM_WINDOW_BASE ), par->saved_extmem, memsize);vfree (par->saved_extmem); + par->saved_extmem =NULL ; }if (par->saved_intmem) { memsize=MEM_INT_SIZE ;
@@ -596,6 +597,7 @@ static void w100fb_restore_vidmem(struct w100fb_par *par)else memcpy_toio (remapped_fbuf + (W100_FB_BASE -MEM_WINDOW_BASE ), par->saved_intmem, memsize);vfree (par->saved_intmem); + par->saved_intmem =NULL ; } }
drivers/watchdog/imx_sc_wdt.c +5 -0
@@ -177,6 +177,11 @@ static int imx_sc_wdt_probe(struct platform_device *pdev) wdog->timeout =DEFAULT_TIMEOUT ;watchdog_init_timeout (wdog,0 , dev); + + ret =imx_sc_wdt_set_timeout (wdog, wdog->timeout); +if (ret) +return ret; +watchdog_stop_on_reboot (wdog);watchdog_stop_on_unregister (wdog);
drivers/xen/pvcalls-back.c +2 -1
@@ -1087,7 +1087,8 @@ static void set_backend_state(struct xenbus_device *dev,case XenbusStateInitialised:switch (state) {case XenbusStateConnected: -backend_connect (dev); +if (backend_connect (dev)) +return ;xenbus_switch_state (dev, XenbusStateConnected);break ;case XenbusStateClosing:
fs/aio.c +8 -0
@@ -176,6 +176,7 @@ struct fsync_iocb {struct file *file;struct work_struct work;bool datasync; +struct cred *creds; };struct poll_iocb {
@@ -1589,8 +1590,11 @@ static int aio_write(struct kiocb *req, const struct iocb *iocb,static void aio_fsync_work (struct work_struct *work) { struct aio_kiocb *iocb = container_of(work, struct aio_kiocb, fsync.work); +const struct cred *old_cred =override_creds (iocb->fsync.creds); iocb->ki_res.res =vfs_fsync (iocb->fsync.file, iocb->fsync.datasync); +revert_creds (old_cred); +put_cred (iocb->fsync.creds);iocb_put (iocb); }
@@ -1604,6 +1608,10 @@ static int aio_fsync(struct fsync_iocb *req, const struct iocb *iocb,if (unlikely (!req->file->f_op->fsync))return -EINVAL ; + req->creds =prepare_creds (); +if (!req->creds) +return -ENOMEM ; + req->datasync = datasync;INIT_WORK (&req->work, aio_fsync_work);schedule_work (&req->work);
fs/cifs/smb2pdu.c +3 -1
@@ -2747,7 +2747,9 @@ SMB2_ioctl_init(struct cifs_tcon *tcon, struct smb_rqst *rqst,* response size smaller. */ req->MaxOutputResponse =cpu_to_le32 (max_response_size); - + req->sync_hdr.CreditCharge = +cpu_to_le16 (DIV_ROUND_UP (max (indatalen, max_response_size), +SMB2_MAX_BUFFER_SIZE ));if (is_fsctl) req->Flags =cpu_to_le32 (SMB2_0_IOCTL_IS_FSCTL );else
fs/fat/inode.c +6 -0
@@ -1519,6 +1519,12 @@ static int fat_read_bpb(struct super_block *sb, struct fat_boot_sector *b, goto out; } +if (bpb->fat_fat_length ==0 && bpb->fat32_length ==0 ) { +if (!silent) +fat_msg (sb,KERN_ERR ,"bogus number of FAT sectors" ); + goto out; + } + error =0 ; out:
fs/gfs2/lops.c +5 -10
@@ -504,12 +504,12 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head,unsigned int bsize = sdp->sd_sb.sb_bsize, off;unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift;unsigned int shift =PAGE_SHIFT - bsize_shift; -unsigned int max_bio_size =2 *1024 *1024 ; +unsigned int max_blocks =2 *1024 *1024 >> bsize_shift;struct gfs2_journal_extent *je;int sz, ret =0 ;struct bio *bio =NULL ;struct page *page =NULL ; -bool bio_chained = false, done = false; +bool done = false;errseq_t since;memset (head,0 ,sizeof (*head));
@@ -532,10 +532,7 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, off =0 ; } -if (!bio || (bio_chained && !off) || - bio->bi_iter.bi_size >= max_bio_size) { -/* start new bio */ - }else { +if (bio && (off || block < blocks_submitted + max_blocks)) {sector_t sector = dblock << sdp->sd_fsb2bb_shift;if (bio_end_sector (bio) == sector) {
@@ -548,19 +545,17 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, (PAGE_SIZE - off) >> bsize_shift; bio =gfs2_chain_bio (bio, blocks); - bio_chained = true; goto add_block_to_new_bio; } }if (bio) { - blocks_submitted = block +1 ; + blocks_submitted = block;submit_bio (bio); } bio =gfs2_log_alloc_bio (sdp, dblock, gfs2_end_log_read); bio->bi_opf =REQ_OP_READ ; - bio_chained = false; add_block_to_new_bio: sz =bio_add_page (bio, page, bsize, off);BUG_ON (sz != bsize);
@@ -568,7 +563,7 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, off += bsize;if (off ==PAGE_SIZE ) page =NULL ; -if (blocks_submitted <2 * max_bio_size >> bsize_shift) { +if (blocks_submitted <= blocks_read + max_blocks) {/* Keep at least one bio in flight */ continue ; }
fs/io_uring.c +2 -2
@@ -3498,8 +3498,8 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, void __user *arg, ret =0 ;if (!pages || nr_pages > got_pages) { -kfree (vmas); -kfree (pages); +kvfree (vmas); +kvfree (pages); pages =kvmalloc_array (nr_pages,sizeof (struct page *),GFP_KERNEL ); vmas = kvmalloc_array(nr_pages,
fs/nilfs2/segment.c +2 -0
@@ -2780,6 +2780,8 @@ int nilfs_attach_log_writer(struct super_block *sb, struct nilfs_root *root)if (!nilfs->ns_writer)return -ENOMEM ; +inode_attach_wb (nilfs->ns_bdev->bd_inode,NULL ); + err =nilfs_segctor_start_thread (nilfs->ns_writer);if (err) {kfree (nilfs->ns_writer);
fs/notify/fanotify/fanotify.c +4 -1
@@ -171,6 +171,10 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group,if (!fsnotify_iter_should_report_type (iter_info, type))continue ; mark = iter_info->marks[type]; + +/* Apply ignore mask regardless of ISDIR and ON_CHILD flags */ + marks_ignored_mask |= mark->ignored_mask; +/* * If the event is on dir and this mark doesn't care about * events on dir, don't send it!
@@ -188,7 +192,6 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group,continue ; marks_mask |= mark->mask; - marks_ignored_mask |= mark->ignored_mask; } test_mask = event_mask & marks_mask & ~marks_ignored_mask;
fs/overlayfs/copy_up.c +1 -1
@@ -40,7 +40,7 @@ int ovl_copy_xattr(struct dentry *old, struct dentry *new) {ssize_t list_size, size, value_size =0 ;char *buf, *name, *value =NULL ; -int uninitialized_var (error ); +int error =0 ;size_t slen; if (!(old->d_inode->i_opflags & IOP_XATTR) ||
fs/proc/inode.c +1 -1
@@ -448,7 +448,7 @@ const struct inode_operations proc_link_inode_operations = {struct inode *proc_get_inode (struct super_block *sb,struct proc_dir_entry *de) { -struct inode *inode =new_inode_pseudo (sb); +struct inode *inode =new_inode (sb);if (inode) { inode->i_ino = de->low_ino;
fs/proc/self.c +1 -1
@@ -43,7 +43,7 @@ int proc_setup_self(struct super_block *s)inode_lock (root_inode); self =d_alloc_name (s->s_root,"self" );if (self) { -struct inode *inode =new_inode_pseudo (s); +struct inode *inode =new_inode (s);if (inode) { inode->i_ino = self_inum; inode->i_mtime = inode->i_atime = inode->i_ctime =current_time (inode);
fs/proc/thread_self.c +1 -1
@@ -43,7 +43,7 @@ int proc_setup_thread_self(struct super_block *s)inode_lock (root_inode); thread_self =d_alloc_name (s->s_root,"thread-self" );if (thread_self) { -struct inode *inode =new_inode_pseudo (s); +struct inode *inode =new_inode (s);if (inode) { inode->i_ino = thread_self_inum; inode->i_mtime = inode->i_atime = inode->i_ctime =current_time (inode);
include/asm-generic/vmlinux.lds.h +19 -3
@@ -496,10 +496,12 @@ __start___modver = .; \ KEEP(*(__modver)) \ __stop___modver = .; \ - . = ALIGN((align)); \ - __end_rodata = .; \ } \ - . = ALIGN((align)); + \ +BTF \ + \ + . = ALIGN((align)); \ + __end_rodata = .;/* RODATA & RO_DATA provided for backward compatibility. * All archs are supposed to use RO_DATA() */
@@ -588,6 +590,20 @@ __stop___ex_table = .; \ } +/* +* .BTF +*/ +#ifdef CONFIG_DEBUG_INFO_BTF +#define BTF \ + .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { \ + __start_BTF = .; \ + *(.BTF) \ + __stop_BTF = .; \ + } +#else +#define BTF +#endif +/* * Init task */
include/linux/elfnote.h +1 -1
@@ -54,7 +54,7 @@ .popsection ;#define ELFNOTE (name, type, desc) \ - ELFNOTE_START(name, type, "") \ + ELFNOTE_START(name, type, "a") \ desc ; \ ELFNOTE_END
include/linux/kvm_host.h +2 -2
@@ -1376,8 +1376,8 @@ static inline long kvm_arch_vcpu_async_ioctl(struct file *filp, }#endif /* CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL */ -int kvm_arch_mmu_notifier_invalidate_range (struct kvm *kvm, -unsigned long start,unsigned long end,bool blockable); +void kvm_arch_mmu_notifier_invalidate_range (struct kvm *kvm, +unsigned long start,unsigned long end);#ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE int kvm_arch_vcpu_run_pid_change (struct kvm_vcpu *vcpu);
include/linux/mm.h +1 -0
@@ -694,6 +694,7 @@ static inline void *kvcalloc(size_t n, size_t size, gfp_t flags) }extern void kvfree (const void *addr); +extern void kvfree_sensitive (const void *addr,size_t len);/* * Mapcount of compound page as a whole, does not include mapped sub-pages.
include/linux/padata.h +4 -2
@@ -145,7 +145,8 @@ struct padata_shell {/** * struct padata_instance - The overall control structure. * -* @cpu_notifier: cpu hotplug notifier. +* @cpu_online_node: Linkage for CPU online callback. +* @cpu_dead_node: Linkage for CPU offline callback. * @parallel_wq: The workqueue used for parallel work. * @serial_wq: The workqueue used for serial work. * @pslist: List of padata_shell objects attached to this instance.
@@ -160,7 +161,8 @@ struct padata_shell {* @flags: padata flags. */ struct padata_instance { -struct hlist_node node; +struct hlist_node cpu_online_node; +struct hlist_node cpu_dead_node;struct workqueue_struct *parallel_wq;struct workqueue_struct *serial_wq;struct list_head pslist;
include/linux/set_memory.h +1 -1
@@ -26,7 +26,7 @@ static inline int set_direct_map_default_noflush(struct page *page)#endif #ifndef set_mce_nospec -static inline int set_mce_nospec (unsigned long pfn) +static inline int set_mce_nospec (unsigned long pfn,bool unmap) {return 0 ; }
include/net/inet_hashtables.h +6 -0
@@ -185,6 +185,12 @@ static inline spinlock_t *inet_ehash_lockp(int inet_ehash_locks_alloc (struct inet_hashinfo *hashinfo); +static inline void inet_hashinfo2_free_mod (struct inet_hashinfo *h) +{ +kfree (h->lhash2); + h->lhash2 =NULL ; +} +static inline void inet_ehash_locks_free (struct inet_hashinfo *hashinfo) {kvfree (hashinfo->ehash_locks);
kernel/bpf/sysfs_btf.c +5 -6
@@ -9,15 +9,15 @@#include <linux/sysfs.h> /* See scripts/link-vmlinux.sh, gen_btf() func for details */ -extern char __weak _binary__btf_vmlinux_bin_start[]; -extern char __weak _binary__btf_vmlinux_bin_end[]; +extern char __weak __start_BTF[]; +extern char __weak __stop_BTF[];static ssize_t btf_vmlinux_read (struct file *file,struct kobject *kobj,struct bin_attribute *bin_attr,char *buf,loff_t off,size_t len) { -memcpy (buf, _binary__btf_vmlinux_bin_start + off, len); +memcpy (buf, __start_BTF + off, len);return len; }
@@ -30,15 +30,14 @@ static struct kobject *btf_kobj;static int __init btf_vmlinux_init (void ) { -if (!_binary__btf_vmlinux_bin_start) +if (!__start_BTF)return 0 ; btf_kobj =kobject_create_and_add ("btf" , kernel_kobj);if (!btf_kobj)return -ENOMEM ; - bin_attr_btf_vmlinux.size = _binary__btf_vmlinux_bin_end - - _binary__btf_vmlinux_bin_start; + bin_attr_btf_vmlinux.size = __stop_BTF - __start_BTF;return sysfs_create_bin_file (btf_kobj, &bin_attr_btf_vmlinux); }
kernel/events/core.c +14 -9
@@ -93,11 +93,11 @@ static void remote_function(void *data)* @info: the function call argument * * Calls the function @func when the task is currently running. This might -* be on the current CPU, which just calls the function directly +* be on the current CPU, which just calls the function directly. This will +* retry due to any failures in smp_call_function_single(), such as if the +* task_cpu() goes offline concurrently. * -* returns: @func return value, or -* -ESRCH - when the process isn't running -* -EAGAIN - when the process moved away +* returns @func return value or -ESRCH when the process isn't running */ static int task_function_call (struct task_struct *p,remote_function_f func,void *info)
@@ -110,11 +110,16 @@ task_function_call(struct task_struct *p, remote_function_f func, void *info) };int ret; -do { - ret =smp_call_function_single (task_cpu (p), remote_function, &data,1 ); -if (!ret) - ret = data.ret; - }while (ret == -EAGAIN ); +for (;;) { + ret =smp_call_function_single (task_cpu (p), remote_function, + &data,1 ); + ret = !ret ? data.ret : -EAGAIN ; + +if (ret != -EAGAIN ) +break ; + +cond_resched (); + }return ret; }
kernel/padata.c +8 -6
@@ -782,7 +782,7 @@ static int padata_cpu_online(unsigned int cpu, struct hlist_node *node)struct padata_instance *pinst;int ret; - pinst = hlist_entry_safe(node, struct padata_instance, node); + pinst = hlist_entry_safe(node, struct padata_instance, cpu_online_node);if (!pinst_has_cpu (pinst, cpu))return 0 ;
@@ -797,7 +797,7 @@ static int padata_cpu_dead(unsigned int cpu, struct hlist_node *node)struct padata_instance *pinst;int ret; - pinst = hlist_entry_safe(node, struct padata_instance, node); + pinst = hlist_entry_safe(node, struct padata_instance, cpu_dead_node);if (!pinst_has_cpu (pinst, cpu))return 0 ;
@@ -813,8 +813,9 @@ static enum cpuhp_state hp_online;static void __padata_free (struct padata_instance *pinst) {#ifdef CONFIG_HOTPLUG_CPU -cpuhp_state_remove_instance_nocalls (CPUHP_PADATA_DEAD , &pinst->node); -cpuhp_state_remove_instance_nocalls (hp_online, &pinst->node); +cpuhp_state_remove_instance_nocalls (CPUHP_PADATA_DEAD , + &pinst->cpu_dead_node); +cpuhp_state_remove_instance_nocalls (hp_online, &pinst->cpu_online_node);#endif WARN_ON (!list_empty (&pinst->pslist));
@@ -1020,9 +1021,10 @@ static struct padata_instance *padata_alloc(const char *name,mutex_init (&pinst->lock);#ifdef CONFIG_HOTPLUG_CPU -cpuhp_state_add_instance_nocalls_cpuslocked (hp_online, &pinst->node); +cpuhp_state_add_instance_nocalls_cpuslocked (hp_online, + &pinst->cpu_online_node);cpuhp_state_add_instance_nocalls_cpuslocked (CPUHP_PADATA_DEAD , - &pinst->node); + &pinst->cpu_dead_node);#endif put_online_cpus ();
kernel/sched/fair.c +1 -1
@@ -2678,7 +2678,7 @@ static void task_tick_numa(struct rq *rq, struct task_struct *curr)/* * We don't care about NUMA placement if we don't have memory. */ -if (!curr->mm || (curr->flags &PF_EXITING ) || work->next != work) +if ((curr->flags & (PF_EXITING |PF_KTHREAD )) || work->next != work)return ;/*
lib/lzo/lzo1x_compress.c +13 -0
@@ -268,6 +268,19 @@ lzo1x_1_do_compress(const unsigned char *in, size_t in_len, *op++ = (M4_MARKER | ((m_off >>11 ) &8 ) | (m_len -2 )); else { +if (unlikely (((m_off &0x403f ) ==0x403f ) + && (m_len >=261 ) + && (m_len <=264 )) + &&likely (bitstream_version)) { +// Under lzo-rle, block copies +// for 261 <= length <= 264 and +// (distance & 0x80f3) == 0x80f3 +// can result in ambiguous +// output. Adjust length +// to 260 to prevent ambiguity. + ip -= m_len -260 ; + m_len =260 ; + } m_len -=M4_MAX_LEN ; *op++ = (M4_MARKER | ((m_off >>11 ) &8 ));while (unlikely (m_len >255 )) {
mm/gup.c +38 -6
85 lines not on this page · raw message
mm/huge_memory.c +3 -4
@@ -1454,13 +1454,12 @@ vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) }/* -* FOLL_FORCE can write to even unwritable pmd's, but only -* after we've gone through a COW cycle and they are dirty. +* FOLL_FORCE or a forced COW break can write even to unwritable pmd's, +* but only after we've gone through a COW cycle and they are dirty. */ static inline bool can_follow_write_pmd (pmd_t pmd,unsigned int flags) { -return pmd_write (pmd) || - ((flags &FOLL_FORCE ) && (flags &FOLL_COW ) &&pmd_dirty (pmd)); +return pmd_write (pmd) || ((flags &FOLL_COW ) &&pmd_dirty (pmd)); } struct page *follow_trans_huge_pmd(struct vm_area_struct *vma,
mm/slub.c +3 -1
@@ -5776,8 +5776,10 @@ static int sysfs_slab_add(struct kmem_cache *s) s->kobj.kset = kset; err =kobject_init_and_add (&s->kobj, &slab_ktype,NULL ,"%s" , name); -if (err) +if (err) { +kobject_put (&s->kobj); goto out; + } err =sysfs_create_group (&s->kobj, &slab_attr_group);if (err)
mm/util.c +18 -0
@@ -594,6 +594,24 @@ void kvfree(const void *addr) }EXPORT_SYMBOL (kvfree); +/** +* kvfree_sensitive - Free a data object containing sensitive information. +* @addr: address of the data object to be freed. +* @len: length of the data object. +* +* Use the special memzero_explicit() function to clear the content of a +* kvmalloc'ed object containing sensitive data to make sure that the +* compiler won't optimize out the data clearing. +*/ +void kvfree_sensitive (const void *addr,size_t len) +{ +if (likely (!ZERO_OR_NULL_PTR (addr))) { +memzero_explicit ((void *)addr, len); +kvfree (addr); + } +} +EXPORT_SYMBOL (kvfree_sensitive); +static inline void *__page_rmapping (struct page *page) {unsigned long mapping;
net/bridge/br_arp_nd_proxy.c +4 -0
@@ -276,6 +276,10 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p, ns_olen = request->len - (skb_network_offset (request) +sizeof (struct ipv6hdr )) -sizeof (*ns);for (i =0 ; i < ns_olen -1 ; i += (ns->opt[i +1 ] <<3 )) { +if (!ns->opt[i +1 ]) { +kfree_skb (reply); +return ; + }if (ns->opt[i] ==ND_OPT_SOURCE_LL_ADDR ) { daddr = ns->opt + i +sizeof (struct nd_opt_hdr );break ;
net/dccp/proto.c +5 -2
@@ -1139,14 +1139,14 @@ static int __init dccp_init(void)inet_hashinfo_init (&dccp_hashinfo); rc =inet_hashinfo2_init_mod (&dccp_hashinfo);if (rc) - goto out_fail; + goto out_free_percpu; rc = -ENOBUFS ; dccp_hashinfo.bind_bucket_cachep =kmem_cache_create ("dccp_bind_bucket" ,sizeof (struct inet_bind_bucket ),0 ,SLAB_HWCACHE_ALIGN ,NULL );if (!dccp_hashinfo.bind_bucket_cachep) - goto out_free_percpu; + goto out_free_hashinfo2;/* * Size and allocate the main established and bind bucket
@@ -1242,6 +1242,8 @@ static int __init dccp_init(void)free_pages ((unsigned long )dccp_hashinfo.ehash, ehash_order); out_free_bind_bucket_cachep:kmem_cache_destroy (dccp_hashinfo.bind_bucket_cachep); +out_free_hashinfo2: +inet_hashinfo2_free_mod (&dccp_hashinfo); out_free_percpu:percpu_counter_destroy (&dccp_orphan_count); out_fail:
@@ -1265,6 +1267,7 @@ static void __exit dccp_fini(void)kmem_cache_destroy (dccp_hashinfo.bind_bucket_cachep);dccp_ackvec_exit ();dccp_sysctl_exit (); +inet_hashinfo2_free_mod (&dccp_hashinfo);percpu_counter_destroy (&dccp_orphan_count); }
net/ipv4/fib_trie.c +3 -0
@@ -2455,6 +2455,7 @@ static int fib_triestat_seq_show(struct seq_file *seq, void *v)" %zd bytes, size of tnode: %zd bytes.\n" , LEAF_SIZE, TNODE_SIZE(0)); +rcu_read_lock ();for (h =0 ; h <FIB_TABLE_HASHSZ ; h++) {struct hlist_head *head = &net->ipv4.fib_table_hash[h];struct fib_table *tb;
@@ -2474,7 +2475,9 @@ static int fib_triestat_seq_show(struct seq_file *seq, void *v)trie_show_usage (seq, t->stats);#endif } +cond_resched_rcu (); } +rcu_read_unlock ();return 0 ; }
net/ipv6/ipv6_sockglue.c +7 -6
@@ -183,14 +183,15 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, retv = -EBUSY ;break ; } - } -if (sk->sk_protocol ==IPPROTO_TCP && - sk->sk_prot != &tcpv6_prot) { - retv = -EBUSY ; + }else if (sk->sk_protocol ==IPPROTO_TCP ) { +if (sk->sk_prot != &tcpv6_prot) { + retv = -EBUSY ; +break ; + } + }else {break ;
Lines of this file are not shown. View the raw message.
sound/firewire/fireface/ff-protocol-latter.c +6 -6
Lines of this file are not shown. View the raw message.
tools/testing/selftests/ftrace/test.d/ftrace/tracing-error-log.tc +2 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/networking/timestamping/rxtimestamp.c +1 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/tc-testing/tc-tests/filters/tests.json +3 -3
Lines of this file are not shown. View the raw message.
tools/testing/selftests/tc-testing/tdc_batch.py +3 -3
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.