Linux 4.19.161
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.19.161 kernel.
All users of the 4.19 kernel series must upgrade.
The updated 4.19.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.19.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
------------
Makefile | 2 arch/arm/boot/dts/dra76x.dtsi | 4 arch/arm64/include/asm/pgtable.h | 34 +++-- arch/x86/events/intel/cstate.c | 6 - arch/x86/events/intel/rapl.c | 14 -- arch/x86/events/intel/uncore.c | 4 arch/x86/events/intel/uncore.h | 12 +- arch/x86/include/asm/kvm_host.h | 1 arch/x86/kernel/cpu/bugs.c | 4 arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 65 ++++------ arch/x86/kvm/irq.c | 85 +++++--------- arch/x86/kvm/lapic.c | 2 arch/x86/kvm/x86.c | 18 +-- arch/x86/xen/spinlock.c | 12 +- arch/xtensa/include/asm/uaccess.h | 2 drivers/dma/pl330.c | 2 drivers/dma/xilinx/xilinx_dma.c | 4 drivers/gpu/drm/drm_atomic.c | 21 --- drivers/gpu/drm/drm_atomic_helper.c | 21 +++ drivers/gpu/drm/drm_connector.c | 11 + drivers/gpu/drm/i915/intel_dp_mst.c | 8 - drivers/hid/hid-cypress.c | 44 ++++++- drivers/hid/hid-ids.h | 8 + drivers/hid/hid-input.c | 3 drivers/hid/hid-quirks.c | 5 drivers/hid/hid-sensor-hub.c | 3 drivers/infiniband/hw/mthca/mthca_cq.c | 10 + drivers/input/serio/i8042.c | 12 +- drivers/net/can/m_can/m_can.c | 2 drivers/net/can/usb/gs_usb.c | 131 +++++++++++----------- drivers/net/ethernet/amazon/ena/ena_netdev.c | 17 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 3 drivers/net/ethernet/ibm/ibmvnic.c | 6 + drivers/nfc/s3fwrn5/i2c.c | 4 drivers/nvme/host/pci.c | 15 ++ drivers/phy/tegra/xusb.c | 1 drivers/platform/x86/thinkpad_acpi.c | 1 drivers/platform/x86/toshiba_acpi.c | 3 drivers/s390/net/qeth_core_main.c | 6 - drivers/scsi/libiscsi.c | 23 ++- drivers/scsi/ufs/ufshcd.c | 6 - drivers/target/iscsi/iscsi_target.c | 17 ++ drivers/tee/optee/call.c | 3 drivers/usb/core/devio.c | 14 +- drivers/usb/core/quirks.c | 10 + drivers/usb/gadget/function/f_midi.c | 10 + drivers/usb/gadget/legacy/inode.c | 3 drivers/video/fbdev/hyperv_fb.c | 7 + fs/btrfs/qgroup.c | 2 fs/btrfs/volumes.c | 8 + fs/efivarfs/inode.c | 2 fs/efivarfs/super.c | 1 fs/proc/self.c | 7 + include/drm/drm_connector.h | 71 +++++++++++ include/linux/netfilter.h | 2 include/scsi/libiscsi.h | 3 include/uapi/linux/wireless.h | 6 - net/batman-adv/log.c | 1 sound/pci/hda/patch_hdmi.c | 20 ++- tools/perf/util/dwarf-aux.c | 8 + tools/perf/util/event.c | 7 - virt/kvm/arm/vgic/vgic-mmio-v3.c | 22 +++ 63 files changed, 540 insertions(+), 323 deletions(-)
Alan Stern (2):
USB: core: Change %pK for __user pointers to %px
USB: core: Fix regression in Hercules audio card
Anand K Mistry (1):
x86/speculation: Fix prctl() when spectre_v2_user={seccomp,prctl},ibpb
Ard Biesheuvel (1):
efivarfs: revert "fix memory leak in efivarfs_create()"
Benjamin Berg (1):
platform/x86: thinkpad_acpi: Send tablet mode switch at wakeup time
Brian Masney (1):
x86/xen: don't unbind uninitialized lock_kicker_irq
Chris Ye (1):
HID: add HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE for Gamevice devices
Cong Wang (1):
netfilter: clear skb->next in NF_HOOK_LIST()
Dexuan Cui (1):
video: hyperv_fb: Fix the cache type when mapping the VRAM
Filipe Manana (1):
btrfs: fix lockdep splat when reading qgroup config on mount
Frank Yang (1):
HID: cypress: Support Varmilo Keyboards' media hotkeys
Greg Kroah-Hartman (1):
Linux 4.19.161
Hans de Goede (2):
Input: i8042 - allow insmod to succeed on devices without an i8042 controller
HID: Add Logitech Dinovo Edge battery quirk
Hauke Mehrtens (1):
wireless: Use linux/stddef.h instead of stddef.h
Igor Lubashev (1):
perf event: Check ref_reloc_sym before using it
Jens Axboe (1):
proc: don't allow async path resolution of /proc/self components
Jiri Kosina (1):
HID: add support for Sega Saturn
Johannes Thumshirn (1):
btrfs: don't access possibly stale fs_info data for printing duplicate device
Julian Wiedmann (1):
s390/qeth: fix tear down of async TX buffers
Kai Vehmanen (1):
ALSA: hda/hdmi: fix incorrect locking in hdmi_pcm_close
Kaixu Xia (1):
platform/x86: toshiba_acpi: Fix the wrong variable assignment
Krzysztof Kozlowski (1):
nfc: s3fwrn5: use signed integer for parsing GPIO numbers
Laurent Pinchart (1):
xtensa: uaccess: Add missing __user to strncpy_from_user() prototype
Lee Duncan (1):
scsi: libiscsi: Fix NOP race condition
Lijun Pan (2):
ibmvnic: fix NULL pointer dereference in reset_sub_crq_queues
ibmvnic: fix NULL pointer dereference in ibmvic_reset_crq
Lyude Paul (1):
drm/atomic_helper: Stop modesets on unregistered connectors harder
Marc Ferland (1):
dmaengine: xilinx_dma: use readl_poll_timeout_atomic variant
Marc Kleine-Budde (3):
ARM: dts: dra76x: m_can: fix order of clocks
can: gs_usb: fix endianess problem with candleLight firmware
can: m_can: fix nominal bitiming tseg2 min for version >= 3.1
Marc Zyngier (1):
phy: tegra: xusb: Fix dangling pointer on probe failure
Masami Hiramatsu (1):
perf probe: Fix to die_entrypc() returns error correctly
Michael Chan (1):
bnxt_en: Release PCI regions when DMA mask setup fails during probe.
Mike Christie (1):
scsi: target: iscsi: Fix cmd abort fabric stop race
Minwoo Im (1):
nvme: free sq/cq dbbuf pointers when dbbuf set fails
Pablo Ceballos (1):
HID: hid-sensor-hub: Fix issue with devices with no report ID
Paolo Bonzini (2):
KVM: x86: handle !lapic_in_kernel case in kvm_cpu_*_extint
KVM: x86: Fix split-irqchip vs interrupt injection window request
Raju Rangoju (1):
cxgb4: fix the panic caused by non smac rewrite
Rui Miguel Silva (1):
optee: add writeback to valid memory type
Sami Tolvanen (1):
perf/x86: fix sysfs type mismatches
Shay Agroskin (1):
net: ena: set initial DMA width to avoid intel iommu issue
Stanley Chu (1):
scsi: ufs: Fix race between shutdown and runtime resume flow
Sugar Zhang (1):
dmaengine: pl330: _prep_dma_memcpy: Fix wrong burst size
Taehee Yoo (1):
batman-adv: set .owner to THIS_MODULE
Will Deacon (2):
arm64: pgtable: Fix pte_accessible()
arm64: pgtable: Ensure dirty bit is preserved across pte_wrprotect()
Xiaochen Shen (2):
x86/resctrl: Remove superfluous kernfs_get() calls to prevent refcount leak x86/resctrl: Add necessary kernfs_put() calls to prevent refcount leak
Xiongfeng Wang (1):
IB/mthca: fix return value of error branch in mthca_init_cq()
Zenghui Yu (1):
KVM: arm64: vgic-v3: Drop the reporting of GICR_TYPER.Last for userspace
Zhang Changzhong (2):
bnxt_en: fix error return code in bnxt_init_one()
bnxt_en: fix error return code in bnxt_init_board()
Zhang Qilong (2):
usb: gadget: f_midi: Fix memleak in f_midi_alloc
usb: gadget: Fix memleak in gadgetfs_fill_super
penghao (1):
USB: quirks: Add USB_QUIRK_DISCONNECT_SUSPEND quirk for Lenovo A630Z TIO built-in usb-audio card
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 160 +SUBLEVEL = 161 EXTRAVERSION = NAME = "People's Front"
arch/arm/boot/dts/dra76x.dtsi +2 -2
@@ -35,8 +35,8 @@ interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "int0", "int1"; - clocks = <&mcan_clk>, <&l3_iclk_div>; - clock-names = "cclk", "hclk"; + clocks = <&l3_iclk_div>, <&mcan_clk>; + clock-names = "hclk", "cclk"; bosch,mram-cfg = <0x0 0 0 32 0 0 1 1>; }; };
arch/arm64/include/asm/pgtable.h +18 -16
@@ -107,8 +107,6 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];#define pte_valid (pte) (!!(pte_val(pte) & PTE_VALID))#define pte_valid_not_user (pte) \ ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) -#define pte_valid_young (pte) \ - ((pte_val(pte) & (PTE_VALID | PTE_AF)) == (PTE_VALID | PTE_AF))#define pte_valid_user (pte) \ ((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER))
@@ -116,9 +114,12 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];* Could the pte be present in the TLB? We must check mm_tlb_flush_pending * so that we don't erroneously return false for pages that have been * remapped as PROT_NONE but are yet to be flushed from the TLB. +* Note that we can't make any assumptions based on the state of the access +* flag, since ptep_clear_flush_young() elides a DSB when invalidating the +* TLB. */ #define pte_accessible (mm, pte) \ - (mm_tlb_flush_pending(mm) ? pte_present(pte) : pte_valid_young(pte)) + (mm_tlb_flush_pending(mm) ? pte_present(pte) : pte_valid(pte))/* * p??_access_permitted() is true for valid user mappings (subject to the
@@ -144,13 +145,6 @@ static inline pte_t set_pte_bit(pte_t pte, pgprot_t prot)return pte; } -static inline pte_t pte_wrprotect (pte_t pte) -{ - pte =clear_pte_bit (pte,__pgprot (PTE_WRITE )); - pte =set_pte_bit (pte,__pgprot (PTE_RDONLY )); -return pte; -} -static inline pte_t pte_mkwrite (pte_t pte) { pte =set_pte_bit (pte,__pgprot (PTE_WRITE ));
@@ -176,6 +170,20 @@ static inline pte_t pte_mkdirty(pte_t pte)return pte; } +static inline pte_t pte_wrprotect (pte_t pte) +{ +/* +* If hardware-dirty (PTE_WRITE/DBM bit set and PTE_RDONLY +* clear), set the PTE_DIRTY bit. +*/ +if (pte_hw_dirty (pte)) + pte =pte_mkdirty (pte); + + pte =clear_pte_bit (pte,__pgprot (PTE_WRITE )); + pte =set_pte_bit (pte,__pgprot (PTE_RDONLY )); +return pte; +} +static inline pte_t pte_mkold (pte_t pte) {return clear_pte_bit (pte,__pgprot (PTE_AF ));
@@ -668,12 +676,6 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addres pte =READ_ONCE (*ptep); do { old_pte = pte; - /* - * If hardware-dirty (PTE_WRITE/DBM bit set and PTE_RDONLY - * clear), set the PTE_DIRTY bit. - */ - if (pte_hw_dirty(pte)) - pte = pte_mkdirty(pte); pte = pte_wrprotect(pte); pte_val(pte) = cmpxchg_relaxed(&pte_val(*ptep), pte_val(old_pte), pte_val(pte));
arch/x86/events/intel/cstate.c +3 -3
@@ -100,14 +100,14 @@MODULE_LICENSE ("GPL" );#define DEFINE_CSTATE_FORMAT_ATTR (_var, _name, _format) \ -static ssize_t __cstate_##_var##_show(struct kobject *kobj, \ - struct kobj_attribute *attr, \ +static ssize_t __cstate_##_var##_show(struct device *dev, \ + struct device_attribute *attr, \ char *page) \ { \ BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \ return sprintf(page, _format "\n"); \ } \ -static struct kobj_attribute format_attr_##_var = \ +static struct device_attribute format_attr_##_var = \ __ATTR(_name, 0444, __cstate_##_var##_show, NULL) static ssize_t cstate_get_attr_cpumask(struct device *dev,
arch/x86/events/intel/rapl.c +1 -13
@@ -115,18 +115,6 @@ static const char *const rapl_domain_names[NR_RAPL_DOMAINS] __initconst = {* any other bit is reserved */ #define RAPL_EVENT_MASK 0xFFULL - -#define DEFINE_RAPL_FORMAT_ATTR (_var, _name, _format) \ -static ssize_t __rapl_##_var##_show(struct kobject *kobj, \ - struct kobj_attribute *attr, \ - char *page) \ -{ \ - BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \ - return sprintf(page, _format "\n"); \ -} \ -static struct kobj_attribute format_attr_##_var = \ - __ATTR(_name, 0444, __rapl_##_var##_show, NULL) -#define RAPL_CNTR_WIDTH 32#define RAPL_EVENT_ATTR_STR (_name, v, str) \
@@ -548,7 +536,7 @@ static struct attribute_group rapl_pmu_events_group = { .attrs = NULL, /* patched at runtime */ }; -DEFINE_RAPL_FORMAT_ATTR (event, event,"config:0-7" ); +PMU_FORMAT_ATTR (event,"config:0-7" );static struct attribute *rapl_formats_attr[] = { &format_attr_event.attr,NULL ,
arch/x86/events/intel/uncore.c +2 -2
@@ -90,8 +90,8 @@ struct pci2phy_map *__find_pci2phy_map(int segment)return map; } -ssize_t uncore_event_show (struct kobject *kobj, -struct kobj_attribute *attr,char *buf) +ssize_t uncore_event_show (struct device *dev, +struct device_attribute *attr,char *buf) {struct uncore_event_desc *event = container_of(attr, struct uncore_event_desc, attr);
arch/x86/events/intel/uncore.h +6 -6
@@ -133,7 +133,7 @@ struct intel_uncore_box {#define UNCORE_BOX_FLAG_CTL_OFFS8 1/* event config registers are 8-byte apart */ struct uncore_event_desc { -struct kobj_attribute attr; +struct device_attribute attr;const char *config; };
@@ -153,8 +153,8 @@ struct pci2phy_map {struct pci2phy_map *__find_pci2phy_map (int segment); -ssize_t uncore_event_show (struct kobject *kobj, -struct kobj_attribute *attr,char *buf); +ssize_t uncore_event_show (struct device *dev, +struct device_attribute *attr,char *buf);#define INTEL_UNCORE_EVENT_DESC (_name, _config) \ { \
@@ -163,14 +163,14 @@ ssize_t uncore_event_show(struct kobject *kobj, }#define DEFINE_UNCORE_FORMAT_ATTR (_var, _name, _format) \ -static ssize_t __uncore_##_var##_show(struct kobject *kobj, \ - struct kobj_attribute *attr, \ +static ssize_t __uncore_##_var##_show(struct device *dev, \ + struct device_attribute *attr, \ char *page) \ { \ BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \ return sprintf(page, _format "\n"); \ } \ -static struct kobj_attribute format_attr_##_var = \ +static struct device_attribute format_attr_##_var = \ __ATTR(_name, 0444, __uncore_##_var##_show, NULL)static inline bool uncore_pmc_fixed (int idx)
arch/x86/include/asm/kvm_host.h +1 -0
@@ -1472,6 +1472,7 @@ int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);void kvm_set_spte_hva (struct kvm *kvm,unsigned long hva,pte_t pte);int kvm_cpu_has_injectable_intr (struct kvm_vcpu *v);int kvm_cpu_has_interrupt (struct kvm_vcpu *vcpu); +int kvm_cpu_has_extint (struct kvm_vcpu *v);int kvm_arch_interrupt_allowed (struct kvm_vcpu *vcpu);int kvm_cpu_get_interrupt (struct kvm_vcpu *v);void kvm_vcpu_reset (struct kvm_vcpu *vcpu,bool init_event);
arch/x86/kernel/cpu/bugs.c +2 -2
@@ -733,11 +733,13 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)if (boot_cpu_has (X86_FEATURE_IBPB )) {setup_force_cpu_cap (X86_FEATURE_USE_IBPB ); + spectre_v2_user_ibpb = mode;switch (cmd) {case SPECTRE_V2_USER_CMD_FORCE :case SPECTRE_V2_USER_CMD_PRCTL_IBPB :case SPECTRE_V2_USER_CMD_SECCOMP_IBPB :static_branch_enable (&switch_mm_always_ibpb); + spectre_v2_user_ibpb =SPECTRE_V2_USER_STRICT ;break ;case SPECTRE_V2_USER_CMD_PRCTL :case SPECTRE_V2_USER_CMD_AUTO :
@@ -751,8 +753,6 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)pr_info ("mitigation: Enabling %s Indirect Branch Prediction Barrier\n" ,static_key_enabled (&switch_mm_always_ibpb) ?"always-on" :"conditional" ); - - spectre_v2_user_ibpb = mode; }/*
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +26 -39
167 lines not on this page · raw message
arch/x86/kvm/irq.c +34 -51
118 lines not on this page · raw message
arch/x86/kvm/lapic.c +1 -1
@@ -2284,7 +2284,7 @@ int kvm_apic_has_interrupt(struct kvm_vcpu *vcpu)struct kvm_lapic *apic = vcpu->arch.apic;u32 ppr; -if (!kvm_apic_hw_enabled (apic)) +if (!kvm_apic_present (vcpu))return -1 ;__apic_update_ppr (apic, &ppr);
arch/x86/kvm/x86.c +10 -8
@@ -3351,21 +3351,23 @@ static int kvm_vcpu_ioctl_set_lapic(struct kvm_vcpu *vcpu,static int kvm_cpu_accept_dm_intr (struct kvm_vcpu *vcpu) { +/* +* We can accept userspace's request for interrupt injection +* as long as we have a place to store the interrupt number. +* The actual injection will happen when the CPU is able to +* deliver the interrupt. +*/ +if (kvm_cpu_has_extint (vcpu)) +return false; + +/* Acknowledging ExtINT does not happen if LINT0 is masked. */ return (!lapic_in_kernel (vcpu) ||kvm_apic_accept_pic_intr (vcpu)); } -/* -* if userspace requested an interrupt window, check that the -* interrupt window is open. -* -* No need to exit to userspace if we already have an interrupt queued. -*/ static int kvm_vcpu_ready_for_interrupt_injection (struct kvm_vcpu *vcpu) {return kvm_arch_interrupt_allowed (vcpu) && - !kvm_cpu_has_interrupt (vcpu) && - !kvm_event_needs_reinjection (vcpu) &&kvm_cpu_accept_dm_intr (vcpu); }
arch/x86/xen/spinlock.c +11 -1
@@ -101,10 +101,20 @@ void xen_init_lock_cpu(int cpu)void xen_uninit_lock_cpu (int cpu) { +int irq; +if (!xen_pvspin)return ; -unbind_from_irqhandler (per_cpu (lock_kicker_irq, cpu),NULL ); +/* +* When booting the kernel with 'mitigations=auto,nosmt', the secondary +* CPUs are not activated, and lock_kicker_irq is not initialized. +*/ + irq =per_cpu (lock_kicker_irq, cpu); +if (irq ==-1 ) +return ; + +unbind_from_irqhandler (irq,NULL );per_cpu (lock_kicker_irq, cpu) =-1 ;kfree (per_cpu (irq_name, cpu));per_cpu (irq_name, cpu) =NULL ;
arch/xtensa/include/asm/uaccess.h +1 -1
@@ -291,7 +291,7 @@ strncpy_from_user(char *dst, const char *src, long count) return -EFAULT; }#else -long strncpy_from_user (char *dst,const char *src,long count); +long strncpy_from_user (char *dst,const char __user *src,long count);#endif /*
drivers/dma/pl330.c +1 -1
@@ -2774,7 +2774,7 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,* If burst size is smaller than bus width then make sure we only * transfer one at a time to avoid a burst stradling an MFIFO entry. */ -if (desc->rqcfg.brst_size *8 < pl330->pcfg.data_bus_width) +if (burst *8 < pl330->pcfg.data_bus_width) desc->rqcfg.brst_len =1 ; desc->bytes_requested = len;
drivers/dma/xilinx/xilinx_dma.c +2 -2
@@ -453,8 +453,8 @@ struct xilinx_dma_device {#define to_dma_tx_descriptor (tx) \ container_of(tx, struct xilinx_dma_tx_descriptor, async_tx)#define xilinx_dma_poll_timeout (chan, reg, val, cond, delay_us, timeout_us) \ - readl_poll_timeout(chan->xdev->regs + chan->ctrl_offset + reg, val, \ - cond, delay_us, timeout_us) + readl_poll_timeout_atomic(chan->xdev->regs + chan->ctrl_offset + reg, \ + val, cond, delay_us, timeout_us)/* IO accessors */ static inline u32 dma_read (struct xilinx_dma_chan *chan,u32 reg)
drivers/gpu/drm/drm_atomic.c +0 -21
@@ -1702,27 +1702,6 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,struct drm_connector *connector = conn_state->connector;struct drm_crtc_state *crtc_state; -/* -* For compatibility with legacy users, we want to make sure that -* we allow DPMS On<->Off modesets on unregistered connectors, since -* legacy modesetting users will not be expecting these to fail. We do -* not however, want to allow legacy users to assign a connector -* that's been unregistered from sysfs to another CRTC, since doing -* this with a now non-existent connector could potentially leave us -* in an invalid state. -* -* Since the connector can be unregistered at any point during an -* atomic check or commit, this is racy. But that's OK: all we care -* about is ensuring that userspace can't use this connector for new -* configurations after it's been notified that the connector is no -* longer present. -*/ -if (!READ_ONCE (connector->registered) && crtc) { -DRM_DEBUG_ATOMIC ("[CONNECTOR:%d:%s] is not registered\n" , - connector->base.id, connector->name); -return -EINVAL ; - } -if (conn_state->crtc == crtc)return 0 ;
drivers/gpu/drm/drm_atomic_helper.c +20 -1
@@ -307,6 +307,26 @@ update_connector_routing(struct drm_atomic_state *state,return 0 ; } + crtc_state =drm_atomic_get_new_crtc_state (state, + new_connector_state->crtc); +/* +* For compatibility with legacy users, we want to make sure that +* we allow DPMS On->Off modesets on unregistered connectors. Modesets +* which would result in anything else must be considered invalid, to +* avoid turning on new displays on dead connectors. +* +* Since the connector can be unregistered at any point during an +* atomic check or commit, this is racy. But that's OK: all we care +* about is ensuring that userspace can't do anything but shut off the +* display on a connector that was destroyed after its been notified, +* not before. +*/ +if (drm_connector_is_unregistered (connector) && crtc_state->active) { +DRM_DEBUG_ATOMIC ("[CONNECTOR:%d:%s] is not registered\n" , + connector->base.id, connector->name); +return -EINVAL ; + } + funcs = connector->helper_private;if (funcs->atomic_best_encoder)
@@ -351,7 +371,6 @@ update_connector_routing(struct drm_atomic_state *state,set_best_encoder (state, new_connector_state, new_encoder); - crtc_state =drm_atomic_get_new_crtc_state (state, new_connector_state->crtc); crtc_state->connectors_changed = true; DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
drivers/gpu/drm/drm_connector.c +6 -5
@@ -375,7 +375,8 @@ void drm_connector_cleanup(struct drm_connector *connector)/* The connector should have been removed from userspace long before * it is finally destroyed. */ -if (WARN_ON (connector->registered)) +if (WARN_ON (connector->registration_state == +DRM_CONNECTOR_REGISTERED ))drm_connector_unregister (connector);if (connector->tile_group) {
@@ -432,7 +433,7 @@ int drm_connector_register(struct drm_connector *connector)return 0 ;mutex_lock (&connector->mutex); -if (connector->registered) +if (connector->registration_state !=DRM_CONNECTOR_INITIALIZING ) goto unlock; ret =drm_sysfs_connector_add (connector);
@@ -452,7 +453,7 @@ int drm_connector_register(struct drm_connector *connector)drm_mode_object_register (connector->dev, &connector->base); - connector->registered = true; + connector->registration_state =DRM_CONNECTOR_REGISTERED ; goto unlock; err_debugfs:
@@ -474,7 +475,7 @@ EXPORT_SYMBOL(drm_connector_register);void drm_connector_unregister (struct drm_connector *connector) {mutex_lock (&connector->mutex); -if (!connector->registered) { +if (connector->registration_state !=DRM_CONNECTOR_REGISTERED ) {mutex_unlock (&connector->mutex);return ; }
@@ -485,7 +486,7 @@ void drm_connector_unregister(struct drm_connector *connector)drm_sysfs_connector_remove (connector);drm_debugfs_connector_remove (connector); - connector->registered = false; + connector->registration_state =DRM_CONNECTOR_UNREGISTERED ;mutex_unlock (&connector->mutex); }EXPORT_SYMBOL (drm_connector_unregister);
drivers/gpu/drm/i915/intel_dp_mst.c +4 -4
@@ -77,7 +77,7 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, pipe_config->pbn = mst_pbn;/* Zombie connectors can't have VCPI slots */ -if (READ_ONCE (connector->registered)) { +if (!drm_connector_is_unregistered (connector)) { slots = drm_dp_atomic_find_vcpi_slots(state, &intel_dp->mst_mgr, port,
@@ -317,7 +317,7 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)struct edid *edid;int ret; -if (!READ_ONCE (connector->registered)) +if (drm_connector_is_unregistered (connector))return intel_connector_update_modes (connector,NULL ); edid =drm_dp_mst_get_edid (connector, &intel_dp->mst_mgr, intel_connector->port);
@@ -333,7 +333,7 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force)struct intel_connector *intel_connector =to_intel_connector (connector);struct intel_dp *intel_dp = intel_connector->mst_port; -if (!READ_ONCE (connector->registered)) +if (drm_connector_is_unregistered (connector))return connector_status_disconnected;return drm_dp_mst_detect_port (connector, &intel_dp->mst_mgr, intel_connector->port);
@@ -376,7 +376,7 @@ intel_dp_mst_mode_valid(struct drm_connector *connector,int bpp =24 ;/* MST uses fixed bpp */ int max_rate, mode_rate, max_lanes, max_link_clock; -if (!READ_ONCE (connector->registered)) +if (drm_connector_is_unregistered (connector))return MODE_ERROR ;if (mode->flags &DRM_MODE_FLAG_DBLSCAN )
drivers/hid/hid-cypress.c +39 -5
70 lines not on this page · raw message
drivers/hid/hid-ids.h +8 -0
@@ -330,6 +330,8 @@#define USB_DEVICE_ID_CYPRESS_BARCODE_4 0xed81#define USB_DEVICE_ID_CYPRESS_TRUETOUCH 0xc001 +#define USB_DEVICE_ID_CYPRESS_VARMILO_VA104M_07B1 0X07b1 +#define USB_VENDOR_ID_DATA_MODUL 0x7374#define USB_VENDOR_ID_DATA_MODUL_EASYMAXTOUCH 0x1201
@@ -442,6 +444,10 @@#define USB_VENDOR_ID_FRUCTEL 0x25B6#define USB_DEVICE_ID_GAMETEL_MT_MODE 0x0002 +#define USB_VENDOR_ID_GAMEVICE 0x27F8 +#define USB_DEVICE_ID_GAMEVICE_GV186 0x0BBE +#define USB_DEVICE_ID_GAMEVICE_KISHI 0x0BBF +#define USB_VENDOR_ID_GAMERON 0x0810#define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001#define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002
@@ -477,6 +483,7 @@#define USB_DEVICE_ID_PENPOWER 0x00f4#define USB_VENDOR_ID_GREENASIA 0x0e8f +#define USB_DEVICE_ID_GREENASIA_DUAL_SAT_ADAPTOR 0x3010#define USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD 0x3013#define USB_VENDOR_ID_GRETAGMACBETH 0x0971
@@ -726,6 +733,7 @@#define USB_VENDOR_ID_LOGITECH 0x046d#define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e#define USB_DEVICE_ID_LOGITECH_T651 0xb00c +#define USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD 0xb309#define USB_DEVICE_ID_LOGITECH_C007 0xc007#define USB_DEVICE_ID_LOGITECH_C077 0xc077#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
drivers/hid/hid-input.c +3 -0
@@ -331,6 +331,9 @@ static const struct hid_device_id hid_battery_quirks[] = { {HID_BLUETOOTH_DEVICE (USB_VENDOR_ID_ASUSTEK ,USB_DEVICE_ID_ASUSTEK_T100CHI_KEYBOARD ), HID_BATTERY_QUIRK_IGNORE }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, +USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD ), + HID_BATTERY_QUIRK_IGNORE }, {} };
drivers/hid/hid-quirks.c +5 -0
@@ -85,7 +85,12 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER), HID_QUIRK_NO_INIT_REPORTS }, { HID_USB_DEVICE(USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_FUTABA, USB_DEVICE_ID_LED_DISPLAY), HID_QUIRK_NO_INIT_REPORTS }, + { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_SAT_ADAPTOR), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD), HID_QUIRK_MULTI_INPUT }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_GAMEVICE, USB_DEVICE_ID_GAMEVICE_GV186), + HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE }, + { HID_USB_DEVICE(USB_VENDOR_ID_GAMEVICE, USB_DEVICE_ID_GAMEVICE_KISHI), + HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE }, { HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
drivers/hid/hid-sensor-hub.c +2 -1
@@ -496,7 +496,8 @@ static int sensor_hub_raw_event(struct hid_device *hdev,return 1 ; ptr = raw_data; - ptr++;/* Skip report id */ +if (report->id) + ptr++;/* Skip report id */ spin_lock_irqsave (&pdata->lock, flags);
drivers/infiniband/hw/mthca/mthca_cq.c +6 -4
@@ -808,8 +808,10 @@ int mthca_init_cq(struct mthca_dev *dev, int nent, } mailbox =mthca_alloc_mailbox (dev,GFP_KERNEL ); -if (IS_ERR (mailbox)) +if (IS_ERR (mailbox)) { + err =PTR_ERR (mailbox); goto err_out_arm; + } cq_context = mailbox->buf;
@@ -851,9 +853,9 @@ int mthca_init_cq(struct mthca_dev *dev, int nent, }spin_lock_irq (&dev->cq_table.lock); -if (mthca_array_set (&dev->cq_table.cq, - cq->cqn & (dev->limits.num_cqs -1 ), - cq)) { + err =mthca_array_set (&dev->cq_table.cq, + cq->cqn & (dev->limits.num_cqs -1 ), cq); +if (err) {spin_unlock_irq (&dev->cq_table.lock); goto err_out_free_mr; }
drivers/input/serio/i8042.c +11 -1
@@ -125,6 +125,7 @@ module_param_named(unmask_kbd_data, i8042_unmask_kbd_data, bool, 0600);MODULE_PARM_DESC (unmask_kbd_data,"Unconditional enable (may reveal sensitive data) of normally sanitize-filtered kbd data traffic debug log [pre-condition: i8042.debug=1 enabled]" );#endif +static bool i8042_present;static bool i8042_bypass_aux_irq_test;static char i8042_kbd_firmware_id[128 ];static char i8042_aux_firmware_id[128 ];
@@ -345,6 +346,9 @@ int i8042_command(unsigned char *param, int command)unsigned long flags;int retval; +if (!i8042_present) +return -1 ; +spin_lock_irqsave (&i8042_lock, flags); retval =__i8042_command (param, command);spin_unlock_irqrestore (&i8042_lock, flags);
@@ -1613,12 +1617,15 @@ static int __init i8042_init(void) err =i8042_platform_init ();if (err) -return err; +return (err == -ENODEV ) ?0 : err; err =i8042_controller_check ();if (err) goto err_platform_exit; +/* Set this before creating the dev to allow i8042_command to work right away */ + i8042_present = true; + pdev =platform_create_bundle (&i8042_driver, i8042_probe,NULL ,0 ,NULL ,0 );if (IS_ERR (pdev)) { err =PTR_ERR (pdev);
@@ -1637,6 +1644,9 @@ static int __init i8042_init(void) static void __exit i8042_exit(void) { +if (!i8042_present) +return ; +platform_device_unregister (i8042_platform_device);platform_driver_unregister (&i8042_driver);i8042_platform_exit ();
drivers/net/can/m_can/m_can.c +1 -1
@@ -976,7 +976,7 @@ static const struct can_bittiming_const m_can_bittiming_const_31X = { .name = KBUILD_MODNAME, .tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */ .tseg1_max = 256, - .tseg2_min = 1, /* Time segment 2 = phase_seg2 */ + .tseg2_min = 2, /* Time segment 2 = phase_seg2 */ .tseg2_max = 128, .sjw_max = 128, .brp_min = 1,
drivers/net/can/usb/gs_usb.c +70 -61
265 lines not on this page · raw message
drivers/net/ethernet/amazon/ena/ena_netdev.c +8 -9
@@ -2433,16 +2433,9 @@ static int ena_device_init(struct ena_com_dev *ena_dev, struct pci_dev *pdev, goto err_mmio_read_less; } - rc =pci_set_dma_mask (pdev,DMA_BIT_MASK (dma_width)); + rc =dma_set_mask_and_coherent (dev,DMA_BIT_MASK (dma_width));if (rc) { -dev_err (dev,"pci_set_dma_mask failed 0x%x\n" , rc); - goto err_mmio_read_less; - } - - rc =pci_set_consistent_dma_mask (pdev,DMA_BIT_MASK (dma_width)); -if (rc) { -dev_err (dev,"err_pci_set_consistent_dma_mask failed 0x%x\n" , - rc); +dev_err (dev,"dma_set_mask_and_coherent failed %d\n" , rc); goto err_mmio_read_less; }
@@ -3183,6 +3176,12 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)return rc; } + rc =dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (ENA_MAX_PHYS_ADDR_SIZE_BITS )); +if (rc) { +dev_err (&pdev->dev,"dma_set_mask_and_coherent failed %d\n" , rc); + goto err_disable_device; + } +pci_set_master (pdev); ena_dev =vzalloc (sizeof (*ena_dev));
drivers/net/ethernet/broadcom/bnxt/bnxt.c +3 -1
@@ -8021,7 +8021,8 @@ static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev)if (dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (64 )) !=0 &&dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (32 )) !=0 ) {dev_err (&pdev->dev,"System does not support DMA, aborting\n" ); - goto init_err_disable; + rc = -EIO ; + goto init_err_release; }pci_set_master (pdev);
@@ -9120,6 +9121,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)create_singlethread_workqueue ("bnxt_pf_wq" );if (!bnxt_pf_wq) {dev_err (&pdev->dev,"Unable to create workqueue.\n" ); + rc = -ENOMEM ; goto init_err_pci_clean; } }
drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c +2 -1
@@ -626,7 +626,8 @@ int set_filter_wr(struct adapter *adapter, int fidx)FW_FILTER_WR_OVLAN_VLD_V (f->fs.val.ovlan_vld) |FW_FILTER_WR_IVLAN_VLDM_V (f->fs.mask.ivlan_vld) | FW_FILTER_WR_OVLAN_VLDM_V(f->fs.mask.ovlan_vld)); - fwr->smac_sel = f->smt->idx; +if (f->fs.newsmac) + fwr->smac_sel = f->smt->idx; fwr->rx_chan_rx_rpl_iq =htons (FW_FILTER_WR_RX_CHAN_V (0 ) |FW_FILTER_WR_RX_RPL_IQ_V (adapter->sge.fw_evtq.abs_id));
drivers/net/ethernet/ibm/ibmvnic.c +6 -0
@@ -2560,6 +2560,9 @@ static int reset_sub_crq_queues(struct ibmvnic_adapter *adapter) {int i, rc; +if (!adapter->tx_scrq || !adapter->rx_scrq) +return -EINVAL ; +for (i =0 ; i < adapter->req_tx_queues; i++) {netdev_dbg (adapter->netdev,"Re-setting tx_scrq[%d]\n" , i); rc =reset_one_sub_crq_queue (adapter, adapter->tx_scrq[i]);
@@ -4459,6 +4462,9 @@ static int ibmvnic_reset_crq(struct ibmvnic_adapter *adapter) }while (rc ==H_BUSY ||H_IS_LONG_BUSY (rc));/* Clean out the queue */ +if (!crq->msgs) +return -EINVAL ; +memset (crq->msgs,0 ,PAGE_SIZE ); crq->cur =0 ; crq->active = false;
drivers/nfc/s3fwrn5/i2c.c +2 -2
@@ -37,8 +37,8 @@ struct s3fwrn5_i2c_phy {struct i2c_client *i2c_dev;struct nci_dev *ndev; -unsigned int gpio_en; -unsigned int gpio_fw_wake; +int gpio_en; +int gpio_fw_wake;struct mutex mutex;
drivers/nvme/host/pci.c +15 -0
@@ -276,9 +276,21 @@ static void nvme_dbbuf_init(struct nvme_dev *dev, nvmeq->dbbuf_cq_ei = &dev->dbbuf_eis[cq_idx (qid, dev->db_stride)]; } +static void nvme_dbbuf_free (struct nvme_queue *nvmeq) +{ +if (!nvmeq->qid) +return ; + + nvmeq->dbbuf_sq_db =NULL ; + nvmeq->dbbuf_cq_db =NULL ; + nvmeq->dbbuf_sq_ei =NULL ; + nvmeq->dbbuf_cq_ei =NULL ; +} +static void nvme_dbbuf_set (struct nvme_dev *dev) {struct nvme_command c; +unsigned int i;if (!dev->dbbuf_dbs)return ;
@@ -292,6 +304,9 @@ static void nvme_dbbuf_set(struct nvme_dev *dev)dev_warn (dev->ctrl.device,"unable to set dbbuf\n" );/* Free memory and continue on */ nvme_dbbuf_dma_free (dev); + +for (i =1 ; i <= dev->online_queues; i++) +nvme_dbbuf_free (&dev->queues[i]); } }
drivers/phy/tegra/xusb.c +1 -0
@@ -899,6 +899,7 @@ static int tegra_xusb_padctl_probe(struct platform_device *pdev) reset:reset_control_assert (padctl->rst); remove: +platform_set_drvdata (pdev,NULL ); soc->ops->remove (padctl);return err; }
drivers/platform/x86/thinkpad_acpi.c +1 -0
@@ -4251,6 +4251,7 @@ static void hotkey_resume(void)pr_err ("error while attempting to reset the event firmware interface\n" );tpacpi_send_radiosw_update (); +tpacpi_input_send_tabletsw ();hotkey_tablet_mode_notify_change ();hotkey_wakeup_reason_notify_change ();hotkey_wakeup_hotunplug_complete_notify_change ();
drivers/platform/x86/toshiba_acpi.c +1 -2
@@ -1497,7 +1497,7 @@ static ssize_t video_proc_write(struct file *file, const char __user *buf,struct toshiba_acpi_dev *dev =PDE_DATA (file_inode (file));char *buffer;char *cmd; -int lcd_out, crt_out, tv_out; +int lcd_out =-1 , crt_out =-1 , tv_out =-1 ;int remain = count;int value;int ret;
@@ -1529,7 +1529,6 @@ static ssize_t video_proc_write(struct file *file, const char __user *buf,kfree (cmd); - lcd_out = crt_out = tv_out =-1 ; ret =get_video_status (dev, &video_out);if (!ret) {unsigned int new_video_out = video_out;
drivers/s390/net/qeth_core_main.c +0 -6
@@ -470,12 +470,6 @@ static void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q, int bidx, } } -if (forced_cleanup && (atomic_read (&(q->bufs[bidx]->state)) == -QETH_QDIO_BUF_HANDLED_DELAYED )) { -/* for recovery situations */ -qeth_init_qdio_out_buf (q, bidx); -QETH_CARD_TEXT (q->card,2 ,"clprecov" ); - } }
drivers/scsi/libiscsi.c +15 -8
@@ -571,8 +571,8 @@ static void iscsi_complete_task(struct iscsi_task *task, int state)if (conn->task == task) conn->task =NULL ; -if (conn->ping_task == task) - conn->ping_task =NULL ; +if (READ_ONCE (conn->ping_task) == task) +WRITE_ONCE (conn->ping_task,NULL );/* release get from queueing */ __iscsi_put_task (task);
@@ -781,6 +781,9 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, task->conn->session->age); } +if (unlikely (READ_ONCE (conn->ping_task) ==INVALID_SCSI_TASK )) +WRITE_ONCE (conn->ping_task, task); +if (!ihost->workq) {if (iscsi_prep_mgmt_task (conn, task)) goto free_task;
@@ -988,8 +991,11 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)struct iscsi_nopout hdr;struct iscsi_task *task; -if (!rhdr && conn->ping_task) -return -EINVAL ; +if (!rhdr) { +if (READ_ONCE (conn->ping_task)) +return -EINVAL ; +WRITE_ONCE (conn->ping_task,INVALID_SCSI_TASK ); + }memset (&hdr,0 ,sizeof (struct iscsi_nopout )); hdr.opcode =ISCSI_OP_NOOP_OUT |ISCSI_OP_IMMEDIATE ;
@@ -1004,11 +1010,12 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr) task =__iscsi_conn_send_pdu (conn, (struct iscsi_hdr *)&hdr,NULL ,0 );if (!task) { +if (!rhdr) +WRITE_ONCE (conn->ping_task,NULL );iscsi_conn_printk (KERN_ERR , conn,"Could not send nopout\n" );return -EIO ; }else if (!rhdr) {/* only track our nops */ - conn->ping_task = task; conn->last_ping = jiffies; }
@@ -1021,7 +1028,7 @@ static int iscsi_nop_out_rsp(struct iscsi_task *task,struct iscsi_conn *conn = task->conn;int rc =0 ; -if (conn->ping_task != task) { +if (READ_ONCE (conn->ping_task) != task) {/* * If this is not in response to one of our * nops then it must be from userspace.
@@ -1961,7 +1968,7 @@ static void iscsi_start_tx(struct iscsi_conn *conn)*/ static int iscsi_has_ping_timed_out (struct iscsi_conn *conn) { -if (conn->ping_task && +if (READ_ONCE (conn->ping_task) &&time_before_eq (conn->last_recv + (conn->recv_timeout *HZ ) + (conn->ping_timeout *HZ ), jiffies))return 1 ;
@@ -2096,7 +2103,7 @@ enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)* Checking the transport already or nop from a cmd timeout still * running */ -if (conn->ping_task) { +if (READ_ONCE (conn->ping_task)) { task->have_checked_conn = true; rc =BLK_EH_RESET_TIMER ; goto done;
drivers/scsi/ufs/ufshcd.c +1 -5
@@ -7926,11 +7926,7 @@ int ufshcd_shutdown(struct ufs_hba *hba)if (ufshcd_is_ufs_dev_poweroff (hba) &&ufshcd_is_link_off (hba)) goto out; -if (pm_runtime_suspended (hba->dev)) { - ret =ufshcd_runtime_resume (hba); -if (ret) - goto out; - } +pm_runtime_get_sync (hba->dev); ret =ufshcd_suspend (hba,UFS_SHUTDOWN_PM ); out:
drivers/target/iscsi/iscsi_target.c +13 -4
@@ -492,8 +492,7 @@ EXPORT_SYMBOL(iscsit_queue_rsp);void iscsit_aborted_task (struct iscsi_conn *conn,struct iscsi_cmd *cmd) {spin_lock_bh (&conn->cmd_lock); -if (!list_empty (&cmd->i_conn_node) && - !(cmd->se_cmd.transport_state &CMD_T_FABRIC_STOP )) +if (!list_empty (&cmd->i_conn_node))list_del_init (&cmd->i_conn_node);spin_unlock_bh (&conn->cmd_lock);
@@ -4054,12 +4053,22 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)spin_lock_bh (&conn->cmd_lock);list_splice_init (&conn->conn_cmd_list, &tmp_list); -list_for_each_entry (cmd, &tmp_list, i_conn_node) { +list_for_each_entry_safe (cmd, cmd_tmp, &tmp_list, i_conn_node) {struct se_cmd *se_cmd = &cmd->se_cmd;if (se_cmd->se_tfo !=NULL ) {spin_lock_irq (&se_cmd->t_state_lock); - se_cmd->transport_state |=CMD_T_FABRIC_STOP ; +if (se_cmd->transport_state &CMD_T_ABORTED ) { +/* +* LIO's abort path owns the cleanup for this, +* so put it back on the list and let +* aborted_task handle it. +*/ +list_move_tail (&cmd->i_conn_node, + &conn->conn_cmd_list); + }else { + se_cmd->transport_state |=CMD_T_FABRIC_STOP ; + }spin_unlock_irq (&se_cmd->t_state_lock); } }
drivers/tee/optee/call.c +2 -1
@@ -538,7 +538,8 @@ void optee_free_pages_list(void *list, size_t num_entries)static bool is_normal_memory (pgprot_t p) {#if defined(CONFIG_ARM ) -return (pgprot_val (p) &L_PTE_MT_MASK ) ==L_PTE_MT_WRITEALLOC ; +return (((pgprot_val (p) &L_PTE_MT_MASK ) ==L_PTE_MT_WRITEALLOC ) || + ((pgprot_val (p) &L_PTE_MT_MASK ) ==L_PTE_MT_WRITEBACK ));#elif defined(CONFIG_ARM64 )return (pgprot_val (p) &PTE_ATTRINDX_MASK ) ==PTE_ATTRINDX (MT_NORMAL );#else
drivers/usb/core/devio.c +7 -7
@@ -463,11 +463,11 @@ static void snoop_urb(struct usb_device *udev,if (userurb) {/* Async */ if (when ==SUBMIT ) -dev_info (&udev->dev,"userurb %pK, ep%d %s-%s, " +dev_info (&udev->dev,"userurb %px, ep%d %s-%s, " "length %u\n" , userurb, ep, t, d, length);else -dev_info (&udev->dev,"userurb %pK, ep%d %s-%s, " +dev_info (&udev->dev,"userurb %px, ep%d %s-%s, " "actual_length %u status %d\n" , userurb, ep, t, d, length, timeout_or_status);
@@ -1927,7 +1927,7 @@ static int proc_reapurb(struct usb_dev_state *ps, void __user *arg)if (as) {int retval; -snoop (&ps->dev->dev,"reap %pK\n" , as->userurb); +snoop (&ps->dev->dev,"reap %px\n" , as->userurb); retval =processcompl (as, (void __user *__user *)arg);free_async (as);return retval;
@@ -1944,7 +1944,7 @@ static int proc_reapurbnonblock(struct usb_dev_state *ps, void __user *arg) as =async_getcompleted (ps);if (as) { -snoop (&ps->dev->dev,"reap %pK\n" , as->userurb); +snoop (&ps->dev->dev,"reap %px\n" , as->userurb); retval =processcompl (as, (void __user *__user *)arg);free_async (as); }else {
@@ -2070,7 +2070,7 @@ static int proc_reapurb_compat(struct usb_dev_state *ps, void __user *arg)if (as) {int retval; -snoop (&ps->dev->dev,"reap %pK\n" , as->userurb); +snoop (&ps->dev->dev,"reap %px\n" , as->userurb); retval =processcompl_compat (as, (void __user *__user *)arg);free_async (as);return retval;
@@ -2087,7 +2087,7 @@ static int proc_reapurbnonblock_compat(struct usb_dev_state *ps, void __user *ar as =async_getcompleted (ps);if (as) { -snoop (&ps->dev->dev,"reap %pK\n" , as->userurb); +snoop (&ps->dev->dev,"reap %px\n" , as->userurb); retval =processcompl_compat (as, (void __user *__user *)arg);free_async (as); }else {
@@ -2512,7 +2512,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,#endif case USBDEVFS_DISCARDURB : -snoop (&dev->dev,"%s: DISCARDURB %pK\n" , __func__, p); +snoop (&dev->dev,"%s: DISCARDURB %px\n" , __func__, p); ret =proc_unlinkurb (ps, p);break ;
drivers/usb/core/quirks.c +10 -0
@@ -348,6 +348,10 @@ static const struct usb_device_id usb_quirk_list[] = {/* Guillemot Webcam Hercules Dualpix Exchange*/ { USB_DEVICE(0x06f8, 0x3005), .driver_info = USB_QUIRK_RESET_RESUME }, + /* Guillemot Hercules DJ Console audio card (BZ 208357) */ + { USB_DEVICE(0x06f8, 0xb000), .driver_info = + USB_QUIRK_ENDPOINT_BLACKLIST }, + /* Midiman M-Audio Keystation 88es */ { USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME },
@@ -421,6 +425,10 @@ static const struct usb_device_id usb_quirk_list[] = { { USB_DEVICE(0x1532, 0x0116), .driver_info = USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL }, + /* Lenovo ThinkCenter A630Z TI024Gen3 usb-audio */ + { USB_DEVICE(0x17ef, 0xa012), .driver_info = + USB_QUIRK_DISCONNECT_SUSPEND }, + /* BUILDWIN Photo Frame */ { USB_DEVICE(0x1908, 0x1315), .driver_info = USB_QUIRK_HONOR_BNUMINTERFACES },
@@ -521,6 +529,8 @@ static const struct usb_device_id usb_amd_resume_quirk_list[] = {* Matched for devices with USB_QUIRK_ENDPOINT_BLACKLIST. */ static const struct usb_device_id usb_endpoint_blacklist[] = { + {USB_DEVICE_INTERFACE_NUMBER (0x06f8 ,0xb000 ,5 ), .driver_info =0x01 }, + {USB_DEVICE_INTERFACE_NUMBER (0x06f8 ,0xb000 ,5 ), .driver_info =0x81 }, {USB_DEVICE_INTERFACE_NUMBER (0x0926 ,0x0202 ,1 ), .driver_info =0x85 }, {USB_DEVICE_INTERFACE_NUMBER (0x0926 ,0x0208 ,1 ), .driver_info =0x85 }, { }
drivers/usb/gadget/function/f_midi.c +7 -3
@@ -1315,7 +1315,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) midi->id =kstrdup (opts->id,GFP_KERNEL );if (opts->id && !midi->id) { status = -ENOMEM ; - goto setup_fail; + goto midi_free; } midi->in_ports = opts->in_ports; midi->out_ports = opts->out_ports;
@@ -1327,7 +1327,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) status =kfifo_alloc (&midi->in_req_fifo, midi->qlen,GFP_KERNEL );if (status) - goto setup_fail; + goto midi_free;spin_lock_init (&midi->transmit_lock);
@@ -1343,9 +1343,13 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi)return &midi->func; +midi_free: +if (midi) +kfree (midi->id); +kfree (midi); setup_fail:mutex_unlock (&opts->lock); -kfree (midi); +return ERR_PTR (status); }
drivers/usb/gadget/legacy/inode.c +3 -0
@@ -2039,6 +2039,9 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent)return 0 ; Enomem: +kfree (CHIP ); +CHIP =NULL ; +return -ENOMEM ; }
drivers/video/fbdev/hyperv_fb.c +6 -1
@@ -712,7 +712,12 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info) goto err1; } - fb_virt =ioremap (par->mem->start, screen_fb_size); +/* +* Map the VRAM cacheable for performance. This is also required for +* VM Connect to display properly for ARM64 Linux VM, as the host also +* maps the VRAM cacheable. +*/ + fb_virt =ioremap_cache (par->mem->start, screen_fb_size);if (!fb_virt) goto err2;
fs/btrfs/qgroup.c +1 -1
@@ -488,13 +488,13 @@ int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info)break ; } out: +btrfs_free_path (path); fs_info->qgroup_flags |= flags;if (!(fs_info->qgroup_flags &BTRFS_QGROUP_STATUS_FLAG_ON ))clear_bit (BTRFS_FS_QUOTA_ENABLED , &fs_info->flags);else if (fs_info->qgroup_flags &BTRFS_QGROUP_STATUS_FLAG_RESCAN && ret >=0 ) ret =qgroup_rescan_init (fs_info, rescan_progress,0 ); -btrfs_free_path (path);if (ret <0 ) {ulist_free (fs_info->qgroup_ulist);
fs/btrfs/volumes.c +7 -1
@@ -857,7 +857,13 @@ static noinline struct btrfs_device *device_list_add(const char *path,if (device->bdev != path_bdev) {bdput (path_bdev);mutex_unlock (&fs_devices->device_list_mutex); - btrfs_warn_in_rcu(device->fs_info, +/* +* device->fs_info may not be reliable here, so +* pass in a NULL instead. This avoids a +* possible use-after-free when the fs_info and +* fs_info->sb are already torn down. +*/ + btrfs_warn_in_rcu(NULL, "duplicate device %s devid %llu generation %llu scanned by %s (%d)", path, devid, found_transid, current->comm,
fs/efivarfs/inode.c +2 -0
@@ -10,6 +10,7 @@#include <linux/efi.h> #include <linux/fs.h> #include <linux/ctype.h> +#include <linux/kmemleak.h> #include <linux/slab.h> #include <linux/uuid.h>
@@ -106,6 +107,7 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry, var->var.VariableName[i] ='\0' ; inode->i_private = var; +kmemleak_ignore (var); err =efivar_entry_add (var, &efivarfs_list);if (err)
fs/efivarfs/super.c +0 -1
@@ -23,7 +23,6 @@ LIST_HEAD(efivarfs_list);static void efivarfs_evict_inode (struct inode *inode) {clear_inode (inode); -kfree (inode->i_private); }static const struct super_operations efivarfs_ops = {
fs/proc/self.c +7 -0
@@ -16,6 +16,13 @@ static const char *proc_self_get_link(struct dentry *dentry,pid_t tgid =task_tgid_nr_ns (current, ns);char *name; +/* +* Not currently supported. Once we can inherit all of struct pid, +* we can allow this. +*/ +if (current->flags &PF_KTHREAD ) +return ERR_PTR (-EOPNOTSUPP ); +if (!tgid)return ERR_PTR (-ENOENT );/* max length of unsigned int in decimal + NULL term */
include/drm/drm_connector.h +69 -2
91 lines not on this page · raw message
include/linux/netfilter.h +1 -1
@@ -300,7 +300,7 @@ NF_HOOK_LIST(uint8_t pf, unsigned int hook, struct net *net, struct sock *sk,INIT_LIST_HEAD (&sublist);list_for_each_entry_safe (skb, next, head, list) { -list_del (&skb->list); +skb_list_del_init (skb);if (nf_hook (pf, hook, net, sk, skb, in, out, okfn) ==1 )list_add_tail (&skb->list, &sublist); }
include/scsi/libiscsi.h +3 -0
@@ -145,6 +145,9 @@ struct iscsi_task {void *dd_data;/* driver/transport data */ }; +/* invalid scsi_task pointer */ +#define INVALID_SCSI_TASK (struct iscsi_task *)-1l +static inline int iscsi_task_has_unsol_data (struct iscsi_task *task) {return task->unsol_r2t.data_length > task->unsol_r2t.sent;
include/uapi/linux/wireless.h +5 -1
@@ -74,7 +74,11 @@#include <linux/socket.h> /* for "struct sockaddr" et al */ #include <linux/if.h> /* for IFNAMSIZ and co... */ -#include <stddef.h> /* for offsetof */ +#ifdef __KERNEL__ +# include <linux/stddef.h> /* for offsetof */ +#else +# include <stddef.h> /* for offsetof */ +#endif /***************************** VERSION *****************************/ /*
net/batman-adv/log.c +1 -0
@@ -205,6 +205,7 @@ static const struct file_operations batadv_log_fops = { .read = batadv_log_read, .poll = batadv_log_poll, .llseek = no_llseek, + .owner = THIS_MODULE, };/**
sound/pci/hda/patch_hdmi.c +12 -8
@@ -1955,20 +1955,23 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo,int pinctl;int err =0 ; +mutex_lock (&spec->pcm_lock);if (hinfo->nid) { pcm_idx =hinfo_to_pcm_index (codec, hinfo); -if (snd_BUG_ON (pcm_idx <0 )) -return -EINVAL ; +if (snd_BUG_ON (pcm_idx <0 )) { + err = -EINVAL ; + goto unlock; + } cvt_idx =cvt_nid_to_cvt_index (codec, hinfo->nid); -if (snd_BUG_ON (cvt_idx <0 )) -return -EINVAL ; +if (snd_BUG_ON (cvt_idx <0 )) { + err = -EINVAL ; + goto unlock; + } per_cvt =get_cvt (spec, cvt_idx); -snd_BUG_ON (!per_cvt->assigned); per_cvt->assigned =0 ; hinfo->nid =0 ; -mutex_lock (&spec->pcm_lock);snd_hda_spdif_ctls_unassign (codec, pcm_idx);clear_bit (pcm_idx, &spec->pcm_in_use); pin_idx =hinfo_to_pin_index (codec, hinfo);
@@ -1996,10 +1999,11 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, per_pin->setup = false; per_pin->channels =0 ;mutex_unlock (&per_pin->lock); - unlock: -mutex_unlock (&spec->pcm_lock); } +unlock: +mutex_unlock (&spec->pcm_lock); +return err; }
tools/perf/util/dwarf-aux.c +8 -0
@@ -332,6 +332,7 @@ bool die_is_func_def(Dwarf_Die *dw_die)int die_entrypc (Dwarf_Die *dw_die,Dwarf_Addr *addr) {Dwarf_Addr base, end; +Dwarf_Attribute attr;if (!addr)return -EINVAL ;
@@ -339,6 +340,13 @@ int die_entrypc(Dwarf_Die *dw_die, Dwarf_Addr *addr)if (dwarf_entrypc (dw_die, addr) ==0 )return 0 ; +/* +* Since the dwarf_ranges() will return 0 if there is no +* DW_AT_ranges attribute, we should check it first. +*/ +if (!dwarf_attr (dw_die, DW_AT_ranges, &attr)) +return -ENOENT ; +return dwarf_ranges (dw_die,0 , &base, addr, &end) <0 ? -ENOENT :0 ; }
tools/perf/util/event.c +4 -3
@@ -912,11 +912,13 @@ static int __perf_event__synthesize_kernel_mmap(struct perf_tool *tool,int err;union perf_event *event; -if (symbol_conf.kptr_restrict) -return -1 ;if (map ==NULL )return -1 ; + kmap =map__kmap (map); +if (!kmap->ref_reloc_sym) +return -1 ; +/* * We should get this from /sys/kernel/sections/.text, but till that is * available use this, and after it is use this as a fallback for older
@@ -939,7 +941,6 @@ static int __perf_event__synthesize_kernel_mmap(struct perf_tool *tool, event->header.misc =PERF_RECORD_MISC_GUEST_KERNEL ; } - kmap =map__kmap (map); size =snprintf (event->mmap.filename,sizeof (event->mmap.filename),"%s%s" , machine->mmap_name, kmap->ref_reloc_sym->name) +1 ; size =PERF_ALIGN (size,sizeof (u64));
virt/kvm/arm/vgic/vgic-mmio-v3.c +20 -2
@@ -226,6 +226,23 @@ static unsigned long vgic_mmio_read_v3r_typer(struct kvm_vcpu *vcpu,return extract_bytes (value, addr &7 , len); } +static unsigned long vgic_uaccess_read_v3r_typer (struct kvm_vcpu *vcpu, +gpa_t addr,unsigned int len) +{ +unsigned long mpidr =kvm_vcpu_get_mpidr_aff (vcpu); +int target_vcpu_id = vcpu->vcpu_id; +u64 value; + + value = (u64)(mpidr &GENMASK (23 ,0 )) <<32 ; + value |= ((target_vcpu_id &0xffff ) <<8 ); + +if (vgic_has_its (vcpu->kvm)) + value |=GICR_TYPER_PLPIS ; + +/* reporting of the Last bit is not supported for userspace */ +return extract_bytes (value, addr &7 , len); +} +static unsigned long vgic_mmio_read_v3r_iidr (struct kvm_vcpu *vcpu,gpa_t addr,unsigned int len) {
@@ -532,8 +549,9 @@ static const struct vgic_register_region vgic_v3_rdbase_registers[] = {REGISTER_DESC_WITH_LENGTH (GICR_IIDR , vgic_mmio_read_v3r_iidr, vgic_mmio_write_wi,4 , VGIC_ACCESS_32bit), -REGISTER_DESC_WITH_LENGTH (GICR_TYPER , - vgic_mmio_read_v3r_typer, vgic_mmio_write_wi,8 , +REGISTER_DESC_WITH_LENGTH_UACCESS (GICR_TYPER , + vgic_mmio_read_v3r_typer, vgic_mmio_write_wi, + vgic_uaccess_read_v3r_typer, vgic_mmio_uaccess_write_wi,8 , VGIC_ACCESS_64bit | VGIC_ACCESS_32bit), REGISTER_DESC_WITH_LENGTH(GICR_WAKER, vgic_mmio_read_raz, vgic_mmio_write_wi, 4,