Linux 4.8.9
Greg KH
maintainerI'm announcing the release of the 4.8.9 kernel.
All users of the 4.8 kernel series must upgrade.
The updated 4.8.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.8.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arc/kernel/time.c | 19 ++- arch/arc/mm/dma.c | 26 ++++ arch/s390/hypfs/hypfs_diag.c | 6 - arch/s390/include/asm/processor.h | 2 arch/s390/kernel/dumpstack.c | 17 ++- arch/s390/kernel/perf_event.c | 2 arch/s390/kernel/stacktrace.c | 4 arch/s390/oprofile/init.c | 2 arch/x86/entry/Makefile | 4 arch/x86/kernel/acpi/boot.c | 1 drivers/acpi/apei/ghes.c | 2 drivers/acpi/pci_link.c | 38 +++---- drivers/block/drbd/drbd_main.c | 2 drivers/char/agp/intel-gtt.c | 2 drivers/char/hw_random/core.c | 6 - drivers/clk/clk-qoriq.c | 13 +- drivers/clk/samsung/clk-exynos-audss.c | 1 drivers/clocksource/timer-sun5i.c | 16 ++ drivers/gpio/gpio-mvebu.c | 92 +++++++---------- drivers/gpio/gpiolib-of.c | 14 +- drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c | 5 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 1 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 1 drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 12 -- drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 6 - drivers/gpu/drm/amd/scheduler/sched_fence.c | 19 +++ drivers/gpu/drm/i915/i915_drv.c | 4 drivers/gpu/drm/i915/intel_display.c | 29 ++++- drivers/gpu/drm/i915/intel_hdmi.c | 84 ++++++++------- drivers/gpu/drm/radeon/radeon_device.c | 13 ++ drivers/iio/accel/st_accel_core.c | 12 +- drivers/iio/common/hid-sensors/hid-sensor-attributes.c | 56 +++++----- drivers/iio/common/st_sensors/st_sensors_core.c | 8 - drivers/iio/orientation/hid-sensor-rotation.c | 1 drivers/input/rmi4/rmi_i2c.c | 38 ++++--- drivers/input/rmi4/rmi_spi.c | 22 ++-- drivers/iommu/amd_iommu.c | 3 drivers/iommu/intel-iommu.c | 14 ++ drivers/iommu/io-pgtable-arm-v7s.c | 4 drivers/media/usb/dvb-usb/dib0700_core.c | 5 drivers/misc/mei/bus-fixup.c | 2 drivers/mmc/core/mmc.c | 3 drivers/mmc/host/mxs-mmc.c | 4 drivers/mmc/host/sdhci-msm.c | 1 drivers/mmc/host/sdhci.c | 28 +++-- drivers/net/ethernet/intel/i40e/i40e_main.c | 2 drivers/nfc/mei_phy.c | 2 drivers/nvme/host/pci.c | 9 - drivers/pci/setup-res.c | 8 + drivers/pinctrl/bcm/pinctrl-iproc-gpio.c | 2 drivers/pinctrl/bcm/pinctrl-nsp-gpio.c | 2 drivers/pinctrl/intel/pinctrl-cherryview.c | 17 ++- drivers/platform/x86/toshiba-wmi.c | 26 +++- drivers/rtc/rtc-pcf2123.c | 5 drivers/scsi/device_handler/scsi_dh_alua.c | 5 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 4 drivers/scsi/qla2xxx/qla_os.c | 2 drivers/staging/comedi/drivers/ni_tio.c | 3 drivers/staging/iio/impedance-analyzer/ad5933.c | 17 +-- drivers/staging/nvec/nvec_ps2.c | 8 - drivers/staging/sm750fb/ddk750_reg.h | 8 - drivers/tty/serial/atmel_serial.c | 27 ++++ drivers/usb/class/cdc-acm.c | 4 drivers/usb/dwc3/core.c | 5 drivers/usb/gadget/function/u_ether.c | 8 - drivers/watchdog/watchdog_core.c | 2 fs/coredump.c | 3 fs/nfs/nfs4session.c | 10 + include/linux/acpi.h | 1 include/linux/frontswap.h | 5 include/linux/sunrpc/svc_rdma.h | 9 + lib/genalloc.c | 3 mm/hugetlb.c | 66 ++++++++++++ mm/memory-failure.c | 12 -- mm/shmem.c | 2 mm/slab_common.c | 4 mm/swapfile.c | 2 net/batman-adv/originator.c | 2 net/ceph/ceph_fs.c | 3 net/netfilter/nf_log.c | 6 - net/sunrpc/xprtrdma/frwr_ops.c | 39 ++++--- net/sunrpc/xprtrdma/svc_rdma_backchannel.c | 2 net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 2 net/sunrpc/xprtrdma/svc_rdma_sendto.c | 24 ---- net/sunrpc/xprtrdma/svc_rdma_transport.c | 18 ++- net/sunrpc/xprtrdma/xprt_rdma.h | 3 sound/core/info.c | 9 + sound/soc/codecs/cs4270.c | 8 - sound/soc/intel/skylake/skl.c | 3 sound/soc/sunxi/sun4i-codec.c | 7 - tools/perf/ui/browsers/hists.c | 3 tools/power/cpupower/utils/cpufreq-set.c | 7 - virt/kvm/arm/vgic/vgic-mmio.c | 41 ++++--- virt/kvm/arm/vgic/vgic-mmio.h | 14 +- 97 files changed, 725 insertions(+), 399 deletions(-)
Adrian Hunter (2):
mmc: sdhci: Fix CMD line reset interfering with ongoing data transfer
mmc: sdhci: Fix unexpected data interrupt handling
Alex Deucher (3):
drm/radeon: disable runtime pm in certain cases drm/amdgpu: disable runtime pm in certain cases drm/amdgpu: fix crash in acp_hw_fini
Alexander Usyskin (1):
mei: bus: fix received data size check in NFC fixup
Alexey Brodkin (1):
arc: Implement arch-specific dma_map_ops.mmap
Andre Przywara (1):
KVM: arm/arm64: vgic: Prevent access to invalid SPIs
Andrew Lutomirski (1):
hwrng: core - Don't use a stack buffer in add_early_randomness()
Andrey Ryabinin (1):
coredump: fix unfreezable coredumping task
Arnd Bergmann (2):
staging: iio: ad5933: avoid uninitialized variable in error case NFSv4.1: work around -Wmaybe-uninitialized warning
Azael Avalos (1):
toshiba-wmi: Fix loading the driver on non Toshiba laptops
Baoquan He (1):
iommu/amd: Free domain id when free a domain of struct dma_ops_domain
Bart Van Assche (1):
scsi: scsi_dh_alua: Fix a reference counting bug
Bill Kuzeja (1):
scsi: qla2xxx: Fix scsi scan hang triggered if adapter fails during init
Bjorn Helgaas (1):
PCI: Don't attempt to claim shadow copies of ROM
Chen-Yu Tsai (2):
Revert "clocksource/drivers/timer_sun5i: Replace code by clocksource_mmio_init"
ASoC: sun4i-codec: return error code instead of NULL when create_card fails
Chris Wilson (1):
agp/intel: Flush chipset writes after updating a single PTE
Christian König (1):
drm/amd: fix scheduler fence teardown order v2
Christophe JAILLET (1):
rtc: pcf2123: Add missing error code assignment before test
Chuck Lever (3):
xprtrdma: Fix DMAR failure in frwr_op_map() after reconnect
svcrdma: Skip put_page() when send_reply() fails
svcrdma: Tail iovec leaves an orphaned DMA mapping
Daniel Mentz (1):
lib/genalloc.c: start search from start of chunk
Daniel Wagner (1):
xprtrdma: use complete() instead complete_all()
Dhinakaran Pandiyan (2):
drm/i915/dp: BDW cdclk fix for DP audio drm/i915/dp: Extend BDW DP audio workaround to GEN9 platforms
Fabio Estevam (1):
mmc: mxs: Initialize the spinlock prior to using it
Felipe Balbi (1):
usb: gadget: u_ether: remove interrupt throttling
Grazvydas Ignotas (3):
drm/amdgpu: fix sched fence slab teardown
drm/amdgpu: fix fence slab teardown
drm/amdgpu: fix a vm_flush fence leak
Greg Kroah-Hartman (1):
Linux 4.8.9
Greg Thelen (1):
memcg: prevent memcg caches to be both OFF_SLAB & OBJFREELIST_SLAB
Guenter Roeck (3):
watchdog: core: Fix devres_alloc() allocation size
Input: synaptics-rmi4 - fix error handling in SPI transport driver
Input: synaptics-rmi4 - fix error handling in I2C transport driver
Heiko Carstens (1):
s390/dumpstack: restore reliable indicator for call traces
Huacai Chen (1):
staging: sm750fb: Fix bugs introduced by early commits
Huaibin Wang (1):
i40e: fix call of ndo_dflt_bridge_getlink()
Hugh Dickins (1):
shmem: fix pageflags after swapping DMA32 object
Ian Abbott (1):
staging: comedi: ni_tio: fix buggy ni_tio_clock_period_ps() return value
Imre Deak (1):
drm/i915: Fix mismatched INIT power domain disabling during suspend
Jan Beulich (1):
x86/build: Fix build with older GCC versions
Jann Horn (2):
swapfile: fix memory corruption via malformed swapfile
netfilter: fix namespace handling in nf_log_proc_dostring
Jason Gunthorpe (1):
gpio/mvebu: Use irq_domain_add_linear
Javier Martinez Canillas (1):
clk: samsung: clk-exynos-audss: Fix module autoload
Joerg Roedel (1):
iommu/vt-d: Fix dead-locks in disable_dmar_iommu() path
Johan Hovold (1):
USB: cdc-acm: fix TIOCMIWAIT
Keith Busch (1):
nvme: Delete created IO queues on reset
Laura Abbott (1):
cpupower: Correct return type of cpu_power_is_cpu_online() in cpufreq-set
Lorenzo Bianconi (1):
iio: st_sensors: fix scale configuration for h3lis331dl
Lukas Wunner (1):
ASoC: Intel: Skylake: Always acquire runtime pm ref on unload
Marc Dietrich (1):
staging: nvec: remove managed resource from PS2 driver
Masahiro Yamada (1):
gpio: of: fix GPIO drivers with multiple gpio_chip for a single node
Michael Holzheu (1):
s390/hypfs: Use get_free_page() instead of kmalloc to ensure page alignment
Mika Westerberg (2):
pinctrl: cherryview: Serialize register access in suspend/resume
pinctrl: cherryview: Prevent possible interrupt storm on resume
Mike Kravetz (1):
mm/hugetlb: fix huge page reservation leak in private mapping error paths
Namhyung Kim (1):
perf top: Fix refreshing hierarchy entries on TUI
Naoya Horiguchi (1):
mm: hwpoison: fix thp split handling in memory_failure()
Oliver Neukum (1):
cdc-acm: fix uninitialized variable
Paul Fertser (2):
drivers: staging: nvec: remove bogus reset command for PS/2 interface Revert "staging: nvec: ps2: change serio type to passthrough"
Punit Agrawal (1):
ACPI / APEI: Fix incorrect return value of ghes_proc()
Ray Jui (1):
pinctrl: iproc: Fix iProc and NSP GPIO support
Richard Genoud (1):
tty/serial: at91: fix hardware handshake on Atmel platforms
Richard Weinberger (1):
drbd: Fix kernel_sendmsg() usage - potential NULL deref
Robin Murphy (1):
iommu/io-pgtable-arm: Check for v7s-incapable systems
Scott Wood (1):
clk: qoriq: Don't allow CPU clocks higher than starting value
Sean Young (1):
dib0700: fix nec repeat handling
Sinan Kaya (3):
ACPI/PCI/IRQ: assign ISA IRQ directly during early boot stages ACPI/PCI: pci_link: penalize SCI correctly
ACPI/PCI: pci_link: Include PIRQ_PENALTY_PCI_USING for ISA IRQs
Song Hongyan (2):
iio: hid-sensors: Increase the precision of scale to fix wrong reading interpretation.
iio: orientation: hid-sensor-rotation: Add PM function (fix non working driver)
Sreekanth Reddy (1):
scsi: mpt3sas: Fix for block device of raid exists even after deleting raid disk
Sven Eckelmann (1):
batman-adv: Modify neigh_list only with rcu-list functions
Takashi Iwai (2):
ALSA: info: Return error for invalid read/write
ALSA: info: Limit the proc text input size
Ulf Hansson (1):
mmc: mmc: Use 500ms as the default generic CMD6 timeout
Ville Syrjälä (1):
drm/i915: Respect alternate_ddc_pin for all DDI ports
Vineet Gupta (1):
ARC: timer: rtc: implement read loop in "C" vs. inline asm
Vivek Gautam (1):
usb: dwc3: Fix error handling for core init
Vlastimil Babka (1):
mm, frontswap: make sure allocated frontswap map is assigned
Wei Yongjun (1):
mmc: sdhci-msm: Fix error return code in sdhci_msm_probe()
Yan, Zheng (1):
libceph: fix legacy layout decode with pool 0
murray foster (1):
ASoC: cs4270: fix DAPM stream name mismatch
tang.junhui (1):
scsi: scsi_dh_alua: fix missing kref_put() in alua_rtpg_work()
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 8 -SUBLEVEL = 8 +SUBLEVEL = 9 EXTRAVERSION = NAME = Psychotic Stoned Sheep
arch/arc/kernel/time.c +11 -8
@@ -152,14 +152,17 @@ static cycle_t arc_read_rtc(struct clocksource *cs)cycle_t full; } stamp; - - __asm__ __volatile( - "1: \n" - " lr %0, [AUX_RTC_LOW] \n" - " lr %1, [AUX_RTC_HIGH] \n" - " lr %2, [AUX_RTC_CTRL] \n" - " bbit0.nt %2, 31, 1b \n" - : "=r" (stamp.low), "=r" (stamp.high), "=r" (status)); +/* +* hardware has an internal state machine which tracks readout of +* low/high and updates the CTRL.status if +* - interrupt/exception taken between the two reads +* - high increments after low has been read +*/ +do { + stamp.low =read_aux_reg (AUX_RTC_LOW ); + stamp.high =read_aux_reg (AUX_RTC_HIGH ); + status =read_aux_reg (AUX_RTC_CTRL ); + }while (!(status &_BITUL (31 )));return stamp.full; }
arch/arc/mm/dma.c +26 -0
@@ -105,6 +105,31 @@ static void arc_dma_free(struct device *dev, size_t size, void *vaddr,__free_pages (page,get_order (size)); } +static int arc_dma_mmap (struct device *dev,struct vm_area_struct *vma, +void *cpu_addr,dma_addr_t dma_addr,size_t size, +unsigned long attrs) +{ +unsigned long user_count =vma_pages (vma); +unsigned long count =PAGE_ALIGN (size) >>PAGE_SHIFT ; +unsigned long pfn =__phys_to_pfn (plat_dma_to_phys (dev, dma_addr)); +unsigned long off = vma->vm_pgoff; +int ret = -ENXIO ; + + vma->vm_page_prot =pgprot_noncached (vma->vm_page_prot); + +if (dma_mmap_from_coherent (dev, vma, cpu_addr, size, &ret)) +return ret; + +if (off < count && user_count <= (count - off)) { + ret =remap_pfn_range (vma, vma->vm_start, + pfn + off, + user_count <<PAGE_SHIFT , + vma->vm_page_prot); + } + +return ret; +} +/* * streaming DMA Mapping API... * CPU accesses page via normal paddr, thus needs to explicitly made
@@ -193,6 +218,7 @@ static int arc_dma_supported(struct device *dev, u64 dma_mask)struct dma_map_ops arc_dma_ops = { .alloc = arc_dma_alloc, .free = arc_dma_free, + .mmap = arc_dma_mmap, .map_page = arc_dma_map_page, .map_sg = arc_dma_map_sg, .sync_single_for_device = arc_dma_sync_single_for_device,
arch/s390/hypfs/hypfs_diag.c +3 -3
@@ -363,11 +363,11 @@ out:static int diag224_get_name_table (void ) {/* memory must be below 2GB */ - diag224_cpu_names =kmalloc (PAGE_SIZE ,GFP_KERNEL |GFP_DMA ); + diag224_cpu_names = (char *)__get_free_page (GFP_KERNEL |GFP_DMA );if (!diag224_cpu_names)return -ENOMEM ;if (diag224 (diag224_cpu_names)) { -kfree (diag224_cpu_names); +free_page ((unsigned long ) diag224_cpu_names);return -EOPNOTSUPP ; }EBCASC (diag224_cpu_names +16 , (*diag224_cpu_names +1 ) *16 );
@@ -376,7 +376,7 @@ static int diag224_get_name_table(void)static void diag224_delete_name_table (void ) { -kfree (diag224_cpu_names); +free_page ((unsigned long ) diag224_cpu_names); }static int diag224_idx2name (int index,char *name)
arch/s390/include/asm/processor.h +1 -1
@@ -192,7 +192,7 @@ struct task_struct;struct mm_struct ;struct seq_file ; -typedef int (*dump_trace_func_t )(void *data,unsigned long address); +typedef int (*dump_trace_func_t )(void *data,unsigned long address,int reliable);void dump_trace (dump_trace_func_t func,void *data,struct task_struct *task,unsigned long sp);
arch/s390/kernel/dumpstack.c +11 -6
@@ -38,10 +38,10 @@ __dump_trace(dump_trace_func_t func, void *data, unsigned long sp,if (sp < low || sp > high -sizeof (*sf))return sp; sf = (struct stack_frame *) sp; +if (func (data, sf->gprs[8 ],0 )) +return sp;/* Follow the backchain. */ while (1 ) { -if (func (data, sf->gprs[8 ])) -return sp; low = sp; sp = sf->back_chain;if (!sp)
@@ -49,6 +49,8 @@ __dump_trace(dump_trace_func_t func, void *data, unsigned long sp,if (sp <= low || sp > high -sizeof (*sf))return sp; sf = (struct stack_frame *) sp; +if (func (data, sf->gprs[8 ],1 )) +return sp; }/* Zero backchain detected, check for interrupt frame. */ sp = (unsigned long ) (sf +1 );
@@ -56,7 +58,7 @@ __dump_trace(dump_trace_func_t func, void *data, unsigned long sp,return sp; regs = (struct pt_regs *) sp;if (!user_mode (regs)) { -if (func (data, regs->psw.addr)) +if (func (data, regs->psw.addr,1 ))return sp; } low = sp;
@@ -90,7 +92,7 @@ struct return_address_data {int depth; }; -static int __return_address (void *data,unsigned long address) +static int __return_address (void *data,unsigned long address,int reliable) {struct return_address_data *rd = data;
@@ -109,9 +111,12 @@ unsigned long return_address(int depth) }EXPORT_SYMBOL_GPL (return_address); -static int show_address (void *data,unsigned long address) +static int show_address (void *data,unsigned long address,int reliable) { -printk ("([<%016lx>] %pSR)\n" , address, (void *)address); +if (reliable) +printk (" [<%016lx>] %pSR \n" , address, (void *)address); +else +printk ("([<%016lx>] %pSR)\n" , address, (void *)address);return 0 ; }
arch/s390/kernel/perf_event.c +1 -1
@@ -222,7 +222,7 @@ static int __init service_level_perf_register(void) }arch_initcall (service_level_perf_register); -static int __perf_callchain_kernel (void *data,unsigned long address) +static int __perf_callchain_kernel (void *data,unsigned long address,int reliable) {struct perf_callchain_entry_ctx *entry = data;
arch/s390/kernel/stacktrace.c +2 -2
@@ -27,12 +27,12 @@ static int __save_address(void *data, unsigned long address, int nosched)return 1 ; } -static int save_address (void *data,unsigned long address) +static int save_address (void *data,unsigned long address,int reliable) {return __save_address (data, address,0 ); } -static int save_address_nosched (void *data,unsigned long address) +static int save_address_nosched (void *data,unsigned long address,int reliable) {return __save_address (data, address,1 ); }
arch/s390/oprofile/init.c +1 -1
@@ -13,7 +13,7 @@#include <linux/init.h> #include <asm/processor.h> -static int __s390_backtrace (void *data,unsigned long address) +static int __s390_backtrace (void *data,unsigned long address,int reliable) {unsigned int *depth = data;
arch/x86/entry/Makefile +2 -2
@@ -5,8 +5,8 @@ OBJECT_FILES_NON_STANDARD_entry_$(BITS).o := y OBJECT_FILES_NON_STANDARD_entry_64_compat.o := y -CFLAGS_syscall_64.o += -Wno-override-init -CFLAGS_syscall_32.o += -Wno-override-init +CFLAGS_syscall_64.o += $(call cc-option,-Wno-override-init,) +CFLAGS_syscall_32.o += $(call cc-option,-Wno-override-init,) obj-y := entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o obj-y += common.o
arch/x86/kernel/acpi/boot.c +1 -0
@@ -453,6 +453,7 @@ static void __init acpi_sci_ioapic_setup(u8 bus_irq, u16 polarity, u16 trigger, polarity = acpi_sci_flags &ACPI_MADT_POLARITY_MASK ;mp_override_legacy_irq (bus_irq, polarity, trigger, gsi); +acpi_penalize_sci_irq (bus_irq, trigger, polarity);/* * stash over-ride to indicate we've been here
drivers/acpi/apei/ghes.c +1 -1
@@ -662,7 +662,7 @@ static int ghes_proc(struct ghes *ghes)ghes_do_proc (ghes, ghes->estatus); out:ghes_clear_estatus (ghes); -return 0 ; +return rc; }static void ghes_add_timer (struct ghes *ghes)
drivers/acpi/pci_link.c +21 -17
@@ -87,6 +87,7 @@ struct acpi_pci_link {static LIST_HEAD (acpi_link_list);static DEFINE_MUTEX (acpi_link_lock); +static int sci_irq =-1 , sci_penalty;/* -------------------------------------------------------------------------- PCI Link Device Management
@@ -496,25 +497,13 @@ static int acpi_irq_get_penalty(int irq) {int penalty =0 ; -/* -* Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict -* with PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be -* use for PCI IRQs. -*/ -if (irq == acpi_gbl_FADT.sci_interrupt) { -u32 type =irq_get_trigger_type (irq) &IRQ_TYPE_SENSE_MASK ; - -if (type !=IRQ_TYPE_LEVEL_LOW ) - penalty +=PIRQ_PENALTY_ISA_ALWAYS ; -else - penalty +=PIRQ_PENALTY_PCI_USING ; - } +if (irq == sci_irq) + penalty += sci_penalty;if (irq <ACPI_MAX_ISA_IRQS )return penalty + acpi_isa_irq_penalty[irq]; - penalty +=acpi_irq_pci_sharing_penalty (irq); -return penalty; +return penalty +acpi_irq_pci_sharing_penalty (irq); }int __init acpi_irq_penalty_init (void )
@@ -619,6 +608,10 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link) acpi_device_bid(link->device));return -ENODEV ; }else { +if (link->irq.active <ACPI_MAX_ISA_IRQS ) + acpi_isa_irq_penalty[link->irq.active] += +PIRQ_PENALTY_PCI_USING ; + printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",acpi_device_name (link->device), acpi_device_bid(link->device), link->irq.active);
@@ -849,7 +842,7 @@ static int __init acpi_irq_penalty_update(char *str, int used)continue ;if (used) - new_penalty =acpi_irq_get_penalty (irq) + + new_penalty = acpi_isa_irq_penalty[irq] +PIRQ_PENALTY_ISA_USED ;else new_penalty =0 ;
@@ -871,7 +864,7 @@ static int __init acpi_irq_penalty_update(char *str, int used)void acpi_penalize_isa_irq (int irq,int active) {if ((irq >=0 ) && (irq <ARRAY_SIZE (acpi_isa_irq_penalty))) - acpi_isa_irq_penalty[irq] =acpi_irq_get_penalty (irq) + + acpi_isa_irq_penalty[irq] += (active ?PIRQ_PENALTY_ISA_USED :PIRQ_PENALTY_PCI_USING ); }
@@ -881,6 +874,17 @@ bool acpi_isa_irq_available(int irq) acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS); } +void acpi_penalize_sci_irq (int irq,int trigger,int polarity) +{ + sci_irq = irq; + +if (trigger ==ACPI_MADT_TRIGGER_LEVEL && + polarity ==ACPI_MADT_POLARITY_ACTIVE_LOW ) + sci_penalty =PIRQ_PENALTY_PCI_USING ; +else + sci_penalty =PIRQ_PENALTY_ISA_ALWAYS ; +} +/* * Over-ride default table to reserve additional IRQs for use by ISA * e.g. acpi_irq_isa=5
drivers/block/drbd/drbd_main.c +1 -1
@@ -1871,7 +1871,7 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock,drbd_update_congested (connection); } do { - rv = kernel_sendmsg(sock, &msg, &iov, 1, size); + rv = kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len); if (rv == -EAGAIN) { if (we_should_drop_the_connection(connection, sock)) break;
drivers/char/agp/intel-gtt.c +2 -0
@@ -845,6 +845,8 @@ void intel_gtt_insert_page(dma_addr_t addr, unsigned int flags) { intel_private.driver->write_entry (addr, pg, flags); +if (intel_private.driver->chipset_flush) + intel_private.driver->chipset_flush (); }EXPORT_SYMBOL (intel_gtt_insert_page);
drivers/char/hw_random/core.c +3 -3
@@ -84,14 +84,14 @@ static size_t rng_buffer_size(void)static void add_early_randomness (struct hwrng *rng) { -unsigned char bytes[16 ];int bytes_read; +size_t size =min_t (size_t,16 ,rng_buffer_size ());mutex_lock (&reading_mutex); - bytes_read =rng_get_data (rng, bytes,sizeof (bytes),1 ); + bytes_read =rng_get_data (rng, rng_buffer, size,1 );mutex_unlock (&reading_mutex);if (bytes_read >0 ) -add_device_randomness (bytes, bytes_read); +add_device_randomness (rng_buffer, bytes_read); }static inline void cleanup_rng (struct kref *kref)
drivers/clk/clk-qoriq.c +8 -5
@@ -700,6 +700,7 @@ static struct clk * __init create_mux_common(struct clockgen *cg,struct mux_hwclock *hwc, const struct clk_ops *ops, unsigned long min_rate, + unsigned long max_rate, unsigned long pct80_rate, const char *fmt, int idx) {
@@ -728,6 +729,8 @@ static struct clk * __init create_mux_common(struct clockgen *cg,continue ;if (rate < min_rate)continue ; +if (rate > max_rate) +continue ; parent_names[j] = div->name; hwc->parent_to_clksel[j] = i;
@@ -759,7 +762,7 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)struct mux_hwclock *hwc;const struct clockgen_pll_div *div;unsigned long plat_rate, min_rate; -u64 pct80_rate; +u64 max_rate, pct80_rate;u32 clksel; hwc =kzalloc (sizeof (*hwc),GFP_KERNEL );
@@ -787,8 +790,8 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)return NULL ; } - pct80_rate =clk_get_rate (div->clk); - pct80_rate *=8 ; + max_rate =clk_get_rate (div->clk); + pct80_rate = max_rate *8 ;do_div (pct80_rate,10 ); plat_rate =clk_get_rate (cg->pll[PLATFORM_PLL ].div[PLL_DIV1 ].clk);
@@ -798,7 +801,7 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)else min_rate = plat_rate /2 ; -return create_mux_common (cg, hwc, &cmux_ops, min_rate, +return create_mux_common (cg, hwc, &cmux_ops, min_rate, max_rate, pct80_rate,"cg-cmux%d" , idx); }
@@ -813,7 +816,7 @@ static struct clk * __init create_one_hwaccel(struct clockgen *cg, int idx) hwc->reg = cg->regs +0x20 * idx +0x10 ; hwc->info = cg->info.hwaccel[idx]; -return create_mux_common (cg, hwc, &hwaccel_ops,0 ,0 , +return create_mux_common (cg, hwc, &hwaccel_ops,0 ,ULONG_MAX ,0 ,"cg-hwaccel%d" , idx); }
drivers/clk/samsung/clk-exynos-audss.c +1 -0
@@ -82,6 +82,7 @@ static const struct of_device_id exynos_audss_clk_of_match[] = { .data = (void *)TYPE_EXYNOS5420, }, {}, }; +MODULE_DEVICE_TABLE (of, exynos_audss_clk_of_match);static void exynos_audss_clk_teardown (void ) {
drivers/clocksource/timer-sun5i.c +14 -2
@@ -152,6 +152,13 @@ static irqreturn_t sun5i_timer_interrupt(int irq, void *dev_id)return IRQ_HANDLED ; } +static cycle_t sun5i_clksrc_read (struct clocksource *clksrc) +{ +struct sun5i_timer_clksrc *cs =to_sun5i_timer_clksrc (clksrc); + +return ~readl (cs->timer.base +TIMER_CNTVAL_LO_REG (1 )); +} +static int sun5i_rate_cb_clksrc (struct notifier_block *nb,unsigned long event,void *data) {
@@ -210,8 +217,13 @@ static int __init sun5i_setup_clocksource(struct device_node *node,writel (TIMER_CTL_ENABLE |TIMER_CTL_RELOAD , base +TIMER_CTL_REG (1 )); - ret =clocksource_mmio_init (base +TIMER_CNTVAL_LO_REG (1 ), node->name, - rate,340 ,32 , clocksource_mmio_readl_down); + cs->clksrc.name = node->name; + cs->clksrc.rating =340 ; + cs->clksrc.read = sun5i_clksrc_read; + cs->clksrc.mask =CLOCKSOURCE_MASK (32 ); + cs->clksrc.flags =CLOCK_SOURCE_IS_CONTINUOUS ; + + ret =clocksource_register_hz (&cs->clksrc, rate);if (ret) {pr_err ("Couldn't register clock source.\n" ); goto err_remove_notifier;
drivers/gpio/gpio-mvebu.c +43 -49
171 lines not on this page · raw message
drivers/gpio/gpiolib-of.c +9 -5
@@ -26,14 +26,18 @@#include "gpiolib.h" -static int of_gpiochip_match_node (struct gpio_chip *chip,void *data) +static int of_gpiochip_match_node_and_xlate (struct gpio_chip *chip,void *data) { -return chip->gpiodev->dev.of_node == data; +struct of_phandle_args *gpiospec = data; + +return chip->gpiodev->dev.of_node == gpiospec->np && + chip->of_xlate (chip, gpiospec,NULL ) >=0 ; } -static struct gpio_chip *of_find_gpiochip_by_node (struct device_node *np) +static struct gpio_chip *of_find_gpiochip_by_xlate ( +struct of_phandle_args *gpiospec) { -return gpiochip_find (np, of_gpiochip_match_node); +return gpiochip_find (gpiospec, of_gpiochip_match_node_and_xlate); } static struct gpio_desc *of_xlate_and_get_gpiod_flags(struct gpio_chip *chip,
@@ -79,7 +83,7 @@ struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,return ERR_PTR (ret); } - chip =of_find_gpiochip_by_node (gpiospec.np); + chip =of_find_gpiochip_by_xlate (&gpiospec);if (!chip) { desc =ERR_PTR (-EPROBE_DEFER ); goto out;
drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c +4 -1
@@ -395,9 +395,12 @@ static int acp_hw_fini(void *handle) {int i, ret;struct device *dev; -struct amdgpu_device *adev = (struct amdgpu_device *)handle; +/* return early if no ACP */ +if (!adev->acp.acp_genpd) +return 0 ; +for (i =0 ; i <ACP_DEVS ; i++) { dev =get_mfd_cell_dev (adev->acp.acp_cell[i].name, i); ret =pm_genpd_remove_device (&adev->acp.acp_genpd->gpd, dev);
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +2 -0
@@ -605,6 +605,7 @@ static int __init amdgpu_init(void) {amdgpu_sync_init ();amdgpu_fence_slab_init (); +amd_sched_fence_slab_init ();if (vgacon_text_force ()) {DRM_ERROR ("VGACON disables amdgpu kernel modesetting.\n" );return -EINVAL ;
@@ -624,6 +625,7 @@ static void __exit amdgpu_exit(void)drm_pci_exit (driver, pdriver);amdgpu_unregister_atpx_handler ();amdgpu_sync_fini (); +amd_sched_fence_slab_fini ();amdgpu_fence_slab_fini (); }
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +1 -0
@@ -68,6 +68,7 @@ int amdgpu_fence_slab_init(void)void amdgpu_fence_slab_fini (void ) { +rcu_barrier ();kmem_cache_destroy (amdgpu_fence_slab); }/*
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +2 -0
@@ -99,6 +99,8 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)if ((amdgpu_runtime_pm !=0 ) &&amdgpu_has_atpx () && + (amdgpu_is_atpx_hybrid () || +amdgpu_has_atpx_dgpu_power_cntl ()) && ((flags &AMD_IS_APU ) ==0 )) flags |=AMD_IS_PX ;
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +1 -0
@@ -1654,5 +1654,6 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev)fence_put (adev->vm_manager.ids[i].first);amdgpu_sync_free (&adev->vm_manager.ids[i].active);fence_put (id->flushed_updates); +fence_put (id->last_flush); } }
drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +0 -12
@@ -34,9 +34,6 @@ static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity);static void amd_sched_wakeup (struct amd_gpu_scheduler *sched);static void amd_sched_process_job (struct fence *f,struct fence_cb *cb); -struct kmem_cache *sched_fence_slab; -atomic_t sched_fence_slab_ref =ATOMIC_INIT (0 ); -/* Initialize a given run queue struct */ static void amd_sched_rq_init (struct amd_sched_rq *rq) {
@@ -618,13 +615,6 @@ int amd_sched_init(struct amd_gpu_scheduler *sched,INIT_LIST_HEAD (&sched->ring_mirror_list);spin_lock_init (&sched->job_list_lock);atomic_set (&sched->hw_rq_count,0 ); -if (atomic_inc_return (&sched_fence_slab_ref) ==1 ) { - sched_fence_slab =kmem_cache_create ( -"amd_sched_fence" ,sizeof (struct amd_sched_fence ),0 , -SLAB_HWCACHE_ALIGN ,NULL ); -if (!sched_fence_slab) -return -ENOMEM ; - }/* Each scheduler will run on a seperate kernel thread */ sched->thread =kthread_run (amd_sched_main, sched, sched->name);
@@ -645,6 +635,4 @@ void amd_sched_fini(struct amd_gpu_scheduler *sched) {if (sched->thread)kthread_stop (sched->thread); -if (atomic_dec_and_test (&sched_fence_slab_ref)) -kmem_cache_destroy (sched_fence_slab); }
drivers/gpu/drm/amd/scheduler/gpu_scheduler.h +3 -3
@@ -30,9 +30,6 @@struct amd_gpu_scheduler ;struct amd_sched_rq ; -extern struct kmem_cache *sched_fence_slab; -extern atomic_t sched_fence_slab_ref; -/** * A scheduler entity is a wrapper around a job queue or a group * of other entities. Entities take turns emitting jobs from their
@@ -145,6 +142,9 @@ void amd_sched_entity_fini(struct amd_gpu_scheduler *sched, struct amd_sched_entity *entity);void amd_sched_entity_push_job (struct amd_sched_job *sched_job); +int amd_sched_fence_slab_init (void ); +void amd_sched_fence_slab_fini (void ); +struct amd_sched_fence *amd_sched_fence_create (struct amd_sched_entity *s_entity,void *owner);void amd_sched_fence_scheduled (struct amd_sched_fence *fence);
drivers/gpu/drm/amd/scheduler/sched_fence.c +19 -0
@@ -27,6 +27,25 @@#include <drm/drmP.h> #include "gpu_scheduler.h" +static struct kmem_cache *sched_fence_slab; + +int amd_sched_fence_slab_init (void ) +{ + sched_fence_slab =kmem_cache_create ( +"amd_sched_fence" ,sizeof (struct amd_sched_fence ),0 , +SLAB_HWCACHE_ALIGN ,NULL ); +if (!sched_fence_slab) +return -ENOMEM ; + +return 0 ; +} + +void amd_sched_fence_slab_fini (void ) +{ +rcu_barrier (); +kmem_cache_destroy (sched_fence_slab); +} +struct amd_sched_fence *amd_sched_fence_create (struct amd_sched_entity *entity,void *owner) {
drivers/gpu/drm/i915/i915_drv.c +2 -2
@@ -1490,8 +1490,6 @@ static int i915_drm_suspend(struct drm_device *dev) dev_priv->suspend_count++; -intel_display_set_init_power (dev_priv, false); -intel_csr_ucode_suspend (dev_priv); out:
@@ -1508,6 +1506,8 @@ static int i915_drm_suspend_late(struct drm_device *drm_dev, bool hibernation)disable_rpm_wakeref_asserts (dev_priv); +intel_display_set_init_power (dev_priv, false); + fw_csr = !IS_BROXTON (dev_priv) &&suspend_to_idle (dev_priv) && dev_priv->csr.dmc_payload;/*
drivers/gpu/drm/i915/intel_display.c +26 -3
@@ -9737,6 +9737,29 @@ static void bxt_modeset_commit_cdclk(struct drm_atomic_state *old_state)bxt_set_cdclk (to_i915 (dev), req_cdclk); } +static int bdw_adjust_min_pipe_pixel_rate (struct intel_crtc_state *crtc_state, +int pixel_rate) +{ +struct drm_i915_private *dev_priv =to_i915 (crtc_state->base.crtc->dev); + +/* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */ +if (IS_BROADWELL (dev_priv) && crtc_state->ips_enabled) + pixel_rate =DIV_ROUND_UP (pixel_rate *100 ,95 ); + +/* BSpec says "Do not use DisplayPort with CDCLK less than +* 432 MHz, audio enabled, port width x4, and link rate +* HBR2 (5.4 GHz), or else there may be audio corruption or +* screen corruption." +*/ +if (intel_crtc_has_dp_encoder (crtc_state) && + crtc_state->has_audio && + crtc_state->port_clock >=540000 && + crtc_state->lane_count ==4 ) + pixel_rate =max (432000 , pixel_rate); + +return pixel_rate; +} +/* compute the max rate for new configuration */ static int ilk_max_pixel_rate (struct drm_atomic_state *state) {
@@ -9762,9 +9785,9 @@ static int ilk_max_pixel_rate(struct drm_atomic_state *state) pixel_rate =ilk_pipe_pixel_rate (crtc_state); -/* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */ -if (IS_BROADWELL (dev_priv) && crtc_state->ips_enabled) - pixel_rate =DIV_ROUND_UP (pixel_rate *100 ,95 ); +if (IS_BROADWELL (dev_priv) ||IS_GEN9 (dev_priv)) + pixel_rate =bdw_adjust_min_pipe_pixel_rate (crtc_state, + pixel_rate); intel_state->min_pixclk[i] = pixel_rate; }
drivers/gpu/drm/i915/intel_hdmi.c +48 -36
119 lines not on this page · raw message
drivers/gpu/drm/radeon/radeon_device.c +13 -0
@@ -104,6 +104,14 @@ static const char radeon_family_name[][16] = { "LAST", }; +#if defined(CONFIG_VGA_SWITCHEROO ) +bool radeon_has_atpx_dgpu_power_cntl (void ); +bool radeon_is_atpx_hybrid (void ); +#else +static inline bool radeon_has_atpx_dgpu_power_cntl (void ) {return false; } +static inline bool radeon_is_atpx_hybrid (void ) {return false; } +#endif +#define RADEON_PX_QUIRK_DISABLE_PX (1 << 0)#define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1)
@@ -160,6 +168,11 @@ static void radeon_device_handle_px_quirks(struct radeon_device *rdev)if (rdev->px_quirk_flags &RADEON_PX_QUIRK_DISABLE_PX ) rdev->flags &= ~RADEON_IS_PX ; + +/* disable PX is the system doesn't support dGPU power control or hybrid gfx */ +if (!radeon_is_atpx_hybrid () && + !radeon_has_atpx_dgpu_power_cntl ()) + rdev->flags &= ~RADEON_IS_PX ; }/**
drivers/iio/accel/st_accel_core.c +8 -4
@@ -743,8 +743,8 @@ static int st_accel_read_raw(struct iio_dev *indio_dev,return IIO_VAL_INT ;case IIO_CHAN_INFO_SCALE : - *val =0 ; - *val2 = adata->current_fullscale->gain; + *val = adata->current_fullscale->gain /1000000 ; + *val2 = adata->current_fullscale->gain %1000000 ;return IIO_VAL_INT_PLUS_MICRO ;case IIO_CHAN_INFO_SAMP_FREQ : *val = adata->odr;
@@ -763,9 +763,13 @@ static int st_accel_write_raw(struct iio_dev *indio_dev,int err;switch (mask) { -case IIO_CHAN_INFO_SCALE : - err =st_sensors_set_fullscale_by_gain (indio_dev, val2); +case IIO_CHAN_INFO_SCALE : { +int gain; + + gain = val *1000000 + val2; + err =st_sensors_set_fullscale_by_gain (indio_dev, gain);break ; + }case IIO_CHAN_INFO_SAMP_FREQ :if (val2)return -EINVAL ;
drivers/iio/common/hid-sensors/hid-sensor-attributes.c +28 -28
122 lines not on this page · raw message
drivers/iio/common/st_sensors/st_sensors_core.c +5 -3
@@ -619,7 +619,7 @@ EXPORT_SYMBOL(st_sensors_sysfs_sampling_frequency_avail);ssize_t st_sensors_sysfs_scale_avail (struct device *dev,struct device_attribute *attr,char *buf) { -int i, len =0 ; +int i, len =0 , q, r;struct iio_dev *indio_dev =dev_get_drvdata (dev);struct st_sensor_data *sdata =iio_priv (indio_dev);
@@ -628,8 +628,10 @@ ssize_t st_sensors_sysfs_scale_avail(struct device *dev,if (sdata->sensor_settings->fs.fs_avl[i].num ==0 )break ; - len +=scnprintf (buf + len,PAGE_SIZE - len,"0.%06u " , - sdata->sensor_settings->fs.fs_avl[i].gain); + q = sdata->sensor_settings->fs.fs_avl[i].gain /1000000 ; + r = sdata->sensor_settings->fs.fs_avl[i].gain %1000000 ; + + len +=scnprintf (buf + len,PAGE_SIZE - len,"%u.%06u " , q, r); }mutex_unlock (&indio_dev->mlock); buf[len -1 ] ='\n' ;
drivers/iio/orientation/hid-sensor-rotation.c +1 -0
@@ -335,6 +335,7 @@ static struct platform_driver hid_dev_rot_platform_driver = { .id_table = hid_dev_rot_ids, .driver = { .name = KBUILD_MODNAME, + .pm = &hid_sensor_pm_ops, }, .probe = hid_dev_rot_probe, .remove = hid_dev_rot_remove,
drivers/input/rmi4/rmi_i2c.c +26 -12
@@ -221,6 +221,21 @@ static const struct of_device_id rmi_i2c_of_match[] = {MODULE_DEVICE_TABLE (of, rmi_i2c_of_match);#endif +static void rmi_i2c_regulator_bulk_disable (void *data) +{ +struct rmi_i2c_xport *rmi_i2c = data; + +regulator_bulk_disable (ARRAY_SIZE (rmi_i2c->supplies), + rmi_i2c->supplies); +} + +static void rmi_i2c_unregister_transport (void *data) +{ +struct rmi_i2c_xport *rmi_i2c = data; + +rmi_unregister_transport_device (&rmi_i2c->xport); +} +static int rmi_i2c_probe (struct i2c_client *client,const struct i2c_device_id *id) {
@@ -264,6 +279,12 @@ static int rmi_i2c_probe(struct i2c_client *client,if (retval <0 )return retval; + retval =devm_add_action_or_reset (&client->dev, + rmi_i2c_regulator_bulk_disable, + rmi_i2c); +if (retval) +return retval; +of_property_read_u32 (client->dev.of_node,"syna,startup-delay-ms" , &rmi_i2c->startup_delay);
@@ -294,6 +315,11 @@ static int rmi_i2c_probe(struct i2c_client *client, client->addr);return retval; } + retval =devm_add_action_or_reset (&client->dev, + rmi_i2c_unregister_transport, + rmi_i2c); +if (retval) +return retval; retval =rmi_i2c_init_irq (client);if (retval <0 )
@@ -304,17 +330,6 @@ static int rmi_i2c_probe(struct i2c_client *client,return 0 ; } -static int rmi_i2c_remove (struct i2c_client *client) -{ -struct rmi_i2c_xport *rmi_i2c =i2c_get_clientdata (client); - -rmi_unregister_transport_device (&rmi_i2c->xport); -regulator_bulk_disable (ARRAY_SIZE (rmi_i2c->supplies), - rmi_i2c->supplies); - -return 0 ; -} -#ifdef CONFIG_PM_SLEEP static int rmi_i2c_suspend (struct device *dev) {
@@ -431,7 +446,6 @@ static struct i2c_driver rmi_i2c_driver = { }, .id_table = rmi_id, .probe = rmi_i2c_probe, - .remove = rmi_i2c_remove, };module_i2c_driver (rmi_i2c_driver);
drivers/input/rmi4/rmi_spi.c +12 -10
@@ -396,6 +396,13 @@ static inline int rmi_spi_of_probe(struct spi_device *spi, }#endif +static void rmi_spi_unregister_transport (void *data) +{ +struct rmi_spi_xport *rmi_spi = data; + +rmi_unregister_transport_device (&rmi_spi->xport); +} +static int rmi_spi_probe (struct spi_device *spi) {struct rmi_spi_xport *rmi_spi;
@@ -464,6 +471,11 @@ static int rmi_spi_probe(struct spi_device *spi)dev_err (&spi->dev,"failed to register transport.\n" );return retval; } + retval =devm_add_action_or_reset (&spi->dev, + rmi_spi_unregister_transport, + rmi_spi); +if (retval) +return retval; retval =rmi_spi_init_irq (spi);if (retval <0 )
@@ -473,15 +485,6 @@ static int rmi_spi_probe(struct spi_device *spi)return 0 ; } -static int rmi_spi_remove (struct spi_device *spi) -{ -struct rmi_spi_xport *rmi_spi =spi_get_drvdata (spi); - -rmi_unregister_transport_device (&rmi_spi->xport); - -return 0 ; -} -#ifdef CONFIG_PM_SLEEP static int rmi_spi_suspend (struct device *dev) {
@@ -577,7 +580,6 @@ static struct spi_driver rmi_spi_driver = { }, .id_table = rmi_id, .probe = rmi_spi_probe, - .remove = rmi_spi_remove, };module_spi_driver (rmi_spi_driver);
drivers/iommu/amd_iommu.c +3 -0
@@ -1654,6 +1654,9 @@ static void dma_ops_domain_free(struct dma_ops_domain *dom)free_pagetable (&dom->domain); +if (dom->domain.id) +domain_id_free (dom->domain.id); +kfree (dom); }
drivers/iommu/intel-iommu.c +12 -2
@@ -1711,6 +1711,7 @@ static void disable_dmar_iommu(struct intel_iommu *iommu)if (!iommu->domains || !iommu->domain_ids)return ; +again:spin_lock_irqsave (&device_domain_lock, flags);list_for_each_entry_safe (info, tmp, &device_domain_list, global) {struct dmar_domain *domain;
@@ -1723,10 +1724,19 @@ static void disable_dmar_iommu(struct intel_iommu *iommu) domain = info->domain; -dmar_remove_one_dev_info (domain, info->dev); +__dmar_remove_one_dev_info (info); -if (!domain_type_is_vm_or_si (domain)) +if (!domain_type_is_vm_or_si (domain)) { +/* +* The domain_exit() function can't be called under +* device_domain_lock, as it takes this lock itself. +* So release the lock here and re-run the loop +* afterwards. +*/ +spin_unlock_irqrestore (&device_domain_lock, flags);domain_exit (domain); + goto again; + } }spin_unlock_irqrestore (&device_domain_lock, flags);
drivers/iommu/io-pgtable-arm-v7s.c +4 -0
@@ -633,6 +633,10 @@ static struct io_pgtable *arm_v7s_alloc_pgtable(struct io_pgtable_cfg *cfg, {struct arm_v7s_io_pgtable *data; +#ifdef PHYS_OFFSET +if (upper_32_bits (PHYS_OFFSET )) +return NULL ; +#endif if (cfg->ias >ARM_V7S_ADDR_BITS || cfg->oas >ARM_V7S_ADDR_BITS )return NULL ;
drivers/media/usb/dvb-usb/dib0700_core.c +3 -2
@@ -677,7 +677,7 @@ static void dib0700_rc_urb_completion(struct urb *purb)struct dvb_usb_device *d = purb->context;struct dib0700_rc_response *poll_reply;enum rc_type protocol; -u32 uninitialized_var (keycode ); +u32 keycode;u8 toggle;deb_info ("%s()\n" , __func__);
@@ -719,7 +719,8 @@ static void dib0700_rc_urb_completion(struct urb *purb) poll_reply->nec.data == 0x00 && poll_reply->nec.not_data == 0xff) { poll_reply->data_state =2 ; -break ; +rc_repeat (d->rc_dev); + goto resubmit; }if ((poll_reply->nec.data ^ poll_reply->nec.not_data) !=0xff ) {
drivers/misc/mei/bus-fixup.c +1 -1
@@ -178,7 +178,7 @@ static int mei_nfc_if_version(struct mei_cl *cl, ret =0 ; bytes_recv =__mei_cl_recv (cl, (u8 *)reply, if_version_length); -if (bytes_recv <0 || bytes_recv <sizeof (struct mei_nfc_reply )) { +if (bytes_recv < if_version_length) {dev_err (bus->dev,"Could not read IF version\n" ); ret = -EIO ; goto err;
drivers/mmc/core/mmc.c +3 -0
@@ -26,6 +26,8 @@#include "mmc_ops.h" #include "sd_ops.h" +#define DEFAULT_CMD6_TIMEOUT_MS 500 +static const unsigned int tran_exp[] = {10000 ,100000 ,1000000 ,10000000 ,0 ,0 ,0 ,0
@@ -571,6 +573,7 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) card->erased_byte =0x0 ;/* eMMC v4.5 or later */ + card->ext_csd.generic_cmd6_time =DEFAULT_CMD6_TIMEOUT_MS ;if (card->ext_csd.rev >=6 ) { card->ext_csd.feature_support |=MMC_DISCARD_FEATURE ;
drivers/mmc/host/mxs-mmc.c +2 -2
@@ -661,13 +661,13 @@ static int mxs_mmc_probe(struct platform_device *pdev)platform_set_drvdata (pdev, mmc); +spin_lock_init (&host->lock); + ret =devm_request_irq (&pdev->dev, irq_err, mxs_mmc_irq_handler,0 ,dev_name (&pdev->dev), host);if (ret) goto out_free_dma; -spin_lock_init (&host->lock); - ret =mmc_add_host (mmc);if (ret) goto out_free_dma;
drivers/mmc/host/sdhci-msm.c +1 -0
@@ -647,6 +647,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)if (msm_host->pwr_irq <0 ) {dev_err (&pdev->dev,"Get pwr_irq failed (%d)\n" , msm_host->pwr_irq); + ret = msm_host->pwr_irq; goto clk_disable; }
drivers/mmc/host/sdhci.c +18 -10
@@ -2269,10 +2269,8 @@ static bool sdhci_request_done(struct sdhci_host *host)for (i =0 ; i <SDHCI_MAX_MRQS ; i++) { mrq = host->mrqs_done[i]; -if (mrq) { - host->mrqs_done[i] =NULL ; +if (mrq)break ; - } }if (!mrq) {
@@ -2303,6 +2301,17 @@ static bool sdhci_request_done(struct sdhci_host *host)* upon error conditions. */ if (sdhci_needs_reset (host, mrq)) { +/* +* Do not finish until command and data lines are available for +* reset. Note there can only be one other mrq, so it cannot +* also be in mrqs_done, otherwise host->cmd and host->data_cmd +* would both be null. +*/ +if (host->cmd || host->data_cmd) { +spin_unlock_irqrestore (&host->lock, flags); +return true; + } +/* Some controllers need this kick or reset won't work here */ if (host->quirks &SDHCI_QUIRK_CLOCK_BEFORE_RESET )/* This is to force an update */
@@ -2310,10 +2319,8 @@ static bool sdhci_request_done(struct sdhci_host *host)/* Spec says we should do both at the same time, but Ricoh controllers do not like that. */ -if (!host->cmd) -sdhci_do_reset (host,SDHCI_RESET_CMD ); -if (!host->data_cmd) -sdhci_do_reset (host,SDHCI_RESET_DATA ); +sdhci_do_reset (host,SDHCI_RESET_CMD ); +sdhci_do_reset (host,SDHCI_RESET_DATA ); host->pending_reset = false; }
@@ -2321,6 +2328,8 @@ static bool sdhci_request_done(struct sdhci_host *host)if (!sdhci_has_requests (host))sdhci_led_deactivate (host); + host->mrqs_done[i] =NULL ; +mmiowb ();spin_unlock_irqrestore (&host->lock, flags);
@@ -2500,9 +2509,6 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)if (!host->data) {struct mmc_command *data_cmd = host->data_cmd; -if (data_cmd) - host->data_cmd =NULL ; -/* * The "data complete" interrupt is also used to * indicate that a busy state has ended. See comment
@@ -2510,11 +2516,13 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)*/ if (data_cmd && (data_cmd->flags &MMC_RSP_BUSY )) {if (intmask &SDHCI_INT_DATA_TIMEOUT ) { + host->data_cmd =NULL ; data_cmd->error = -ETIMEDOUT ;sdhci_finish_mrq (host, data_cmd->mrq);return ; }if (intmask &SDHCI_INT_DATA_END ) { + host->data_cmd =NULL ;/* * Some cards handle busy-end interrupt * before the command completed, so make
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -9001,7 +9001,7 @@ static int i40e_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,return 0 ;return ndo_dflt_bridge_getlink (skb, pid, seq, dev, veb->bridge_mode, - nlflags,0 ,0 , filter_mask,NULL ); +0 ,0 , nlflags, filter_mask,NULL ); }/* Hardware supports L4 tunnel length of 128B (=2^7) which includes
drivers/nfc/mei_phy.c +1 -1
@@ -133,7 +133,7 @@ static int mei_nfc_if_version(struct nfc_mei_phy *phy)return -ENOMEM ; bytes_recv =mei_cldev_recv (phy->cldev, (u8 *)reply, if_version_length); -if (bytes_recv <0 || bytes_recv <sizeof (struct mei_nfc_reply )) { +if (bytes_recv <0 || bytes_recv < if_version_length) {pr_err ("Could not read IF version\n" ); r = -EIO ; goto err;
drivers/nvme/host/pci.c +5 -4
@@ -1531,9 +1531,9 @@ static int nvme_delete_queue(struct nvme_queue *nvmeq, u8 opcode)return 0 ; } -static void nvme_disable_io_queues (struct nvme_dev *dev) +static void nvme_disable_io_queues (struct nvme_dev *dev,int queues) { -int pass, queues = dev->online_queues -1 ; +int pass;unsigned long timeout;u8 opcode = nvme_admin_delete_sq;
@@ -1678,7 +1678,7 @@ static void nvme_pci_disable(struct nvme_dev *dev)static void nvme_dev_disable (struct nvme_dev *dev,bool shutdown) { -int i; +int i, queues;u32 csts =-1 ;del_timer_sync (&dev->watchdog_timer);
@@ -1689,6 +1689,7 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown) csts =readl (dev->bar +NVME_REG_CSTS ); } + queues = dev->online_queues -1 ;for (i = dev->queue_count -1 ; i >0 ; i--)nvme_suspend_queue (dev->queues[i]);
@@ -1700,7 +1701,7 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown)if (dev->queue_count)nvme_suspend_queue (dev->queues[0 ]); }else { -nvme_disable_io_queues (dev); +nvme_disable_io_queues (dev, queues);nvme_disable_admin_queue (dev, shutdown); }nvme_pci_disable (dev);
drivers/pci/setup-res.c +8 -0
@@ -121,6 +121,14 @@ int pci_claim_resource(struct pci_dev *dev, int resource)return -EINVAL ; } +/* +* If we have a shadow copy in RAM, the PCI device doesn't respond +* to the shadow range, so we don't need to claim it, and upstream +* bridges don't need to route the range to the device. +*/ +if (res->flags &IORESOURCE_ROM_SHADOW ) +return 0 ; + root =pci_find_parent_resource (dev, res);if (!root) { dev_info(&dev->dev, "can't claim BAR %d %pR: no compatible bridge window\n",
drivers/pinctrl/bcm/pinctrl-iproc-gpio.c +1 -1
@@ -844,6 +844,6 @@ static struct platform_driver iproc_gpio_driver = {static int __init iproc_gpio_init (void ) { -return platform_driver_probe (&iproc_gpio_driver, iproc_gpio_probe); +return platform_driver_register (&iproc_gpio_driver); }arch_initcall_sync (iproc_gpio_init);
drivers/pinctrl/bcm/pinctrl-nsp-gpio.c +1 -1
@@ -741,6 +741,6 @@ static struct platform_driver nsp_gpio_driver = {static int __init nsp_gpio_init (void ) { -return platform_driver_probe (&nsp_gpio_driver, nsp_gpio_probe); +return platform_driver_register (&nsp_gpio_driver); }arch_initcall_sync (nsp_gpio_init);
drivers/pinctrl/intel/pinctrl-cherryview.c +14 -3
@@ -1634,12 +1634,15 @@ static int chv_pinctrl_remove(struct platform_device *pdev) }#ifdef CONFIG_PM_SLEEP -static int chv_pinctrl_suspend (struct device *dev) +static int chv_pinctrl_suspend_noirq (struct device *dev) {struct platform_device *pdev =to_platform_device (dev);struct chv_pinctrl *pctrl =platform_get_drvdata (pdev); +unsigned long flags;int i; +raw_spin_lock_irqsave (&chv_lock, flags); + pctrl->saved_intmask =readl (pctrl->regs +CHV_INTMASK );for (i =0 ; i < pctrl->community->npins; i++) {
@@ -1660,15 +1663,20 @@ static int chv_pinctrl_suspend(struct device *dev) ctx->padctrl1 =readl (reg); } +raw_spin_unlock_irqrestore (&chv_lock, flags); +return 0 ; } -static int chv_pinctrl_resume (struct device *dev) +static int chv_pinctrl_resume_noirq (struct device *dev) {struct platform_device *pdev =to_platform_device (dev);struct chv_pinctrl *pctrl =platform_get_drvdata (pdev); +unsigned long flags;int i; +raw_spin_lock_irqsave (&chv_lock, flags); +/* * Mask all interrupts before restoring per-pin configuration * registers because we don't know in which state BIOS left them
@@ -1713,12 +1721,15 @@ static int chv_pinctrl_resume(struct device *dev)chv_writel (0xffff , pctrl->regs +CHV_INTSTAT );chv_writel (pctrl->saved_intmask, pctrl->regs +CHV_INTMASK ); +raw_spin_unlock_irqrestore (&chv_lock, flags); +return 0 ; }#endif static const struct dev_pm_ops chv_pinctrl_pm_ops = { -SET_LATE_SYSTEM_SLEEP_PM_OPS (chv_pinctrl_suspend, chv_pinctrl_resume) +SET_NOIRQ_SYSTEM_SLEEP_PM_OPS (chv_pinctrl_suspend_noirq, + chv_pinctrl_resume_noirq) };static const struct acpi_device_id chv_pinctrl_acpi_match[] = {
drivers/platform/x86/toshiba-wmi.c +19 -7
@@ -24,14 +24,15 @@#include <linux/acpi.h> #include <linux/input.h> #include <linux/input/sparse-keymap.h> +#include <linux/dmi.h> MODULE_AUTHOR ("Azael Avalos" );MODULE_DESCRIPTION ("Toshiba WMI Hotkey Driver" );MODULE_LICENSE ("GPL" ); -#define TOSHIBA_WMI_EVENT_GUID "59142400-C6A3-40FA-BADB-8A2652834100" +#define WMI_EVENT_GUID "59142400-C6A3-40FA-BADB-8A2652834100" -MODULE_ALIAS ("wmi:" TOSHIBA_WMI_EVENT_GUID ); +MODULE_ALIAS ("wmi:" WMI_EVENT_GUID );static struct input_dev *toshiba_wmi_input_dev;
@@ -63,6 +64,16 @@ static void toshiba_wmi_notify(u32 value, void *context)kfree (response.pointer); } +static struct dmi_system_id toshiba_wmi_dmi_table[]__initdata = { + { + .ident ="Toshiba laptop" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), + }, + }, + {} +}; +static int __init toshiba_wmi_input_setup (void ) {acpi_status status;
@@ -81,7 +92,7 @@ static int __init toshiba_wmi_input_setup(void)if (err) goto err_free_dev; - status =wmi_install_notify_handler (TOSHIBA_WMI_EVENT_GUID , + status =wmi_install_notify_handler (WMI_EVENT_GUID , toshiba_wmi_notify,NULL );if (ACPI_FAILURE (status)) { err = -EIO ;
@@ -95,7 +106,7 @@ static int __init toshiba_wmi_input_setup(void)return 0 ; err_remove_notifier: -wmi_remove_notify_handler (TOSHIBA_WMI_EVENT_GUID ); +wmi_remove_notify_handler (WMI_EVENT_GUID ); err_free_keymap:sparse_keymap_free (toshiba_wmi_input_dev); err_free_dev:
@@ -105,7 +116,7 @@ static int __init toshiba_wmi_input_setup(void)static void toshiba_wmi_input_destroy (void ) { -wmi_remove_notify_handler (TOSHIBA_WMI_EVENT_GUID ); +wmi_remove_notify_handler (WMI_EVENT_GUID );sparse_keymap_free (toshiba_wmi_input_dev);input_unregister_device (toshiba_wmi_input_dev); }
@@ -114,7 +125,8 @@ static int __init toshiba_wmi_init(void) {int ret; -if (!wmi_has_guid (TOSHIBA_WMI_EVENT_GUID )) +if (!wmi_has_guid (WMI_EVENT_GUID ) || + !dmi_check_system (toshiba_wmi_dmi_table))return -ENODEV ; ret =toshiba_wmi_input_setup ();
@@ -130,7 +142,7 @@ static int __init toshiba_wmi_init(void) static void __exit toshiba_wmi_exit(void) { -if (wmi_has_guid (TOSHIBA_WMI_EVENT_GUID )) +if (wmi_has_guid (WMI_EVENT_GUID ))toshiba_wmi_input_destroy (); }
drivers/rtc/rtc-pcf2123.c +3 -2
@@ -182,7 +182,8 @@ static ssize_t pcf2123_show(struct device *dev, struct device_attribute *attr, }static ssize_t pcf2123_store (struct device *dev,struct device_attribute *attr, -const char *buffer,size_t count) { +const char *buffer,size_t count) +{struct pcf2123_sysfs_reg *r;unsigned long reg;unsigned long val;
@@ -199,7 +200,7 @@ static ssize_t pcf2123_store(struct device *dev, struct device_attribute *attr,if (ret)return ret; -pcf2123_write_reg (dev, reg, val); + ret =pcf2123_write_reg (dev, reg, val);if (ret <0 )return -EIO ;return count;
drivers/scsi/device_handler/scsi_dh_alua.c +4 -1
@@ -792,6 +792,7 @@ static void alua_rtpg_work(struct work_struct *work)WARN_ON (pg->flags &ALUA_PG_RUN_RTPG );WARN_ON (pg->flags &ALUA_PG_RUN_STPG );spin_unlock_irqrestore (&pg->lock, flags); +kref_put (&pg->kref, release_port_group);return ; }if (pg->flags &ALUA_SYNC_STPG )
@@ -889,6 +890,7 @@ static void alua_rtpg_queue(struct alua_port_group *pg,/* Do not queue if the worker is already running */ if (!(pg->flags &ALUA_PG_RUNNING )) {kref_get (&pg->kref); + sdev =NULL ; start_queue =1 ; } }
@@ -900,7 +902,8 @@ static void alua_rtpg_queue(struct alua_port_group *pg,if (start_queue && !queue_delayed_work (alua_wq, &pg->rtpg_work,msecs_to_jiffies (ALUA_RTPG_DELAY_MSECS ))) { -scsi_device_put (sdev); +if (sdev) +scsi_device_put (sdev);kref_put (&pg->kref, release_port_group); } }
drivers/scsi/mpt3sas/mpt3sas_scsih.c +2 -2
@@ -1273,9 +1273,9 @@ scsih_target_alloc(struct scsi_target *starget) sas_target_priv_data->handle = raid_device->handle; sas_target_priv_data->sas_address = raid_device->wwid; sas_target_priv_data->flags |=MPT_TARGET_FLAGS_VOLUME ; - sas_target_priv_data->raid_device = raid_device;if (ioc->is_warpdrive) - raid_device->starget = starget; + sas_target_priv_data->raid_device = raid_device; + raid_device->starget = starget; }spin_unlock_irqrestore (&ioc->raid_device_lock, flags);return 0 ;
drivers/scsi/qla2xxx/qla_os.c +2 -0
@@ -2341,6 +2341,8 @@ qla2xxx_scan_finished(struct Scsi_Host *shost, unsigned long time) {scsi_qla_host_t *vha =shost_priv (shost); +if (test_bit (UNLOADING , &vha->dpc_flags)) +return 1 ;if (!vha->host)return 1 ;if (time > vha->hw->loop_reset_delay *HZ )
drivers/staging/comedi/drivers/ni_tio.c +2 -1
@@ -207,7 +207,8 @@ static int ni_tio_clock_period_ps(const struct ni_gpct *counter,* clock period is specified by user with prescaling * already taken into account. */ -return counter->clock_period_ps; + *period_ps = counter->clock_period_ps; +return 0 ; }switch (generic_clock_source &NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK ) {
drivers/staging/iio/impedance-analyzer/ad5933.c +10 -7
@@ -655,6 +655,7 @@ static void ad5933_work(struct work_struct *work)__be16 buf[2 ];int val[2 ];unsigned char status; +int ret;mutex_lock (&indio_dev->mlock);if (st->state ==AD5933_CTRL_INIT_START_FREQ ) {
@@ -662,19 +663,22 @@ static void ad5933_work(struct work_struct *work)ad5933_cmd (st,AD5933_CTRL_START_SWEEP ); st->state =AD5933_CTRL_START_SWEEP ;schedule_delayed_work (&st->work, st->poll_time_jiffies); -mutex_unlock (&indio_dev->mlock); -return ; + goto out; } -ad5933_i2c_read (st->client,AD5933_REG_STATUS ,1 , &status); + ret =ad5933_i2c_read (st->client,AD5933_REG_STATUS ,1 , &status); +if (ret) + goto out;if (status &AD5933_STAT_DATA_VALID ) {int scan_count =bitmap_weight (indio_dev->active_scan_mask, indio_dev->masklength); -ad5933_i2c_read (st->client, + ret =ad5933_i2c_read (st->client,test_bit (1 , indio_dev->active_scan_mask) ?AD5933_REG_REAL_DATA :AD5933_REG_IMAG_DATA , scan_count *2 , (u8 *)buf); +if (ret) + goto out;if (scan_count ==2 ) { val[0 ] =be16_to_cpu (buf[0 ]);
@@ -686,8 +690,7 @@ static void ad5933_work(struct work_struct *work) }else {/* no data available - try again later */ schedule_delayed_work (&st->work, st->poll_time_jiffies); -mutex_unlock (&indio_dev->mlock); -return ; + goto out; }if (status &AD5933_STAT_SWEEP_DONE ) {
@@ -700,7 +703,7 @@ static void ad5933_work(struct work_struct *work)ad5933_cmd (st,AD5933_CTRL_INC_FREQ );schedule_delayed_work (&st->work, st->poll_time_jiffies); } - +out:mutex_unlock (&indio_dev->mlock); }
drivers/staging/nvec/nvec_ps2.c +2 -6
@@ -106,13 +106,12 @@ static int nvec_mouse_probe(struct platform_device *pdev) {struct nvec_chip *nvec =dev_get_drvdata (pdev->dev.parent);struct serio *ser_dev; -char mouse_reset[] = {NVEC_PS2 ,SEND_COMMAND ,PSMOUSE_RST ,3 }; - ser_dev =devm_kzalloc (&pdev->dev,sizeof (struct serio ),GFP_KERNEL ); + ser_dev =kzalloc (sizeof (struct serio ),GFP_KERNEL );if (!ser_dev)return -ENOMEM ; - ser_dev->id.type =SERIO_PS_PSTHRU ; + ser_dev->id.type =SERIO_8042 ; ser_dev->write = ps2_sendcommand; ser_dev->start = ps2_startstreaming; ser_dev->stop = ps2_stopstreaming;
@@ -127,9 +126,6 @@ static int nvec_mouse_probe(struct platform_device *pdev)serio_register_port (ser_dev); -/* mouse reset */ -nvec_write_async (nvec, mouse_reset,sizeof (mouse_reset)); -return 0 ; }
drivers/staging/sm750fb/ddk750_reg.h +4 -4
@@ -601,13 +601,13 @@#define PANEL_PLANE_TL 0x08001C#define PANEL_PLANE_TL_TOP_SHIFT 16 -#define PANEL_PLANE_TL_TOP_MASK (0xeff << 16) -#define PANEL_PLANE_TL_LEFT_MASK 0xeff +#define PANEL_PLANE_TL_TOP_MASK (0x7ff << 16) +#define PANEL_PLANE_TL_LEFT_MASK 0x7ff#define PANEL_PLANE_BR 0x080020#define PANEL_PLANE_BR_BOTTOM_SHIFT 16 -#define PANEL_PLANE_BR_BOTTOM_MASK (0xeff << 16) -#define PANEL_PLANE_BR_RIGHT_MASK 0xeff +#define PANEL_PLANE_BR_BOTTOM_MASK (0x7ff << 16) +#define PANEL_PLANE_BR_RIGHT_MASK 0x7ff#define PANEL_HORIZONTAL_TOTAL 0x080024#define PANEL_HORIZONTAL_TOTAL_TOTAL_SHIFT 16
drivers/tty/serial/atmel_serial.c +23 -4
@@ -2026,6 +2026,7 @@ static void atmel_serial_pm(struct uart_port *port, unsigned int state,static void atmel_set_termios (struct uart_port *port,struct ktermios *termios,struct ktermios *old) { +struct atmel_uart_port *atmel_port =to_atmel_uart_port (port);unsigned long flags;unsigned int old_mode, mode, imr, quot, baud;
@@ -2129,11 +2130,29 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, mode |=ATMEL_US_USMODE_RS485 ; }else if (termios->c_cflag &CRTSCTS ) {/* RS232 with hardware handshake (RTS/CTS) */ -if (atmel_use_dma_rx (port) && !atmel_use_fifo (port)) { -dev_info (port->dev,"not enabling hardware flow control because DMA is used" ); - termios->c_cflag &= ~CRTSCTS ; - }else { +if (atmel_use_fifo (port) && + !mctrl_gpio_to_gpiod (atmel_port->gpios,UART_GPIO_CTS )) { +/* +* with ATMEL_US_USMODE_HWHS set, the controller will +* be able to drive the RTS pin high/low when the RX +* FIFO is above RXFTHRES/below RXFTHRES2. +* It will also disable the transmitter when the CTS +* pin is high. +* This mode is not activated if CTS pin is a GPIO +* because in this case, the transmitter is always +* disabled (there must be an internal pull-up +* responsible for this behaviour). +* If the RTS pin is a GPIO, the controller won't be +* able to drive it according to the FIFO thresholds, +* but it will be handled by the driver. +*/ mode |=ATMEL_US_USMODE_HWHS ; + }else { +/* +* For platforms without FIFO, the flow control is +* handled by the driver. +*/ + mode |=ATMEL_US_USMODE_NORMAL ; } }else {/* RS232 without hadware handshake */
drivers/usb/class/cdc-acm.c +2 -2
@@ -946,8 +946,6 @@ static int wait_serial_change(struct acm *acm, unsigned long arg)DECLARE_WAITQUEUE (wait, current);struct async_icount old, new; -if (arg & (TIOCM_DSR |TIOCM_RI |TIOCM_CD )) -return -EINVAL ; do { spin_lock_irq(&acm->read_lock); old = acm->oldcount;
@@ -1175,6 +1173,8 @@ static int acm_probe(struct usb_interface *intf,if (quirks ==IGNORE_DEVICE )return -ENODEV ; +memset (&h,0x00 ,sizeof (struct usb_cdc_parsed_header )); + num_rx_buf = (quirks ==SINGLE_RX_URB ) ?1 :ACM_NR ;/* handle quirks deadly to normal probing*/
drivers/usb/dwc3/core.c +2 -3
@@ -669,15 +669,14 @@ static int dwc3_core_init(struct dwc3 *dwc)return 0 ; err4: -phy_power_off (dwc->usb2_generic_phy); +phy_power_off (dwc->usb3_generic_phy); err3: -phy_power_off (dwc->usb3_generic_phy); +phy_power_off (dwc->usb2_generic_phy); err2:usb_phy_set_suspend (dwc->usb2_phy,1 );usb_phy_set_suspend (dwc->usb3_phy,1 ); -dwc3_core_exit (dwc); err1:usb_phy_shutdown (dwc->usb2_phy);
drivers/usb/gadget/function/u_ether.c +0 -8
@@ -585,14 +585,6 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb, req->length = length; -/* throttle high/super speed IRQ rate back slightly */ -if (gadget_is_dualspeed (dev->gadget)) - req->no_interrupt = (((dev->gadget->speed ==USB_SPEED_HIGH || - dev->gadget->speed ==USB_SPEED_SUPER )) && - !list_empty (&dev->tx_reqs)) - ? ((atomic_read (&dev->tx_qlen) % dev->qmult) !=0 ) - :0 ; - retval =usb_ep_queue (in, req,GFP_ATOMIC );switch (retval) {default :
drivers/watchdog/watchdog_core.c +1 -1
@@ -349,7 +349,7 @@ int devm_watchdog_register_device(struct device *dev,struct watchdog_device **rcwdd;int ret; - rcwdd =devres_alloc (devm_watchdog_unregister_device,sizeof (*wdd), + rcwdd =devres_alloc (devm_watchdog_unregister_device,sizeof (*rcwdd),GFP_KERNEL );if (!rcwdd)return -ENOMEM ;
fs/coredump.c +3 -0
@@ -1,6 +1,7 @@#include <linux/slab.h> #include <linux/file.h> #include <linux/fdtable.h> +#include <linux/freezer.h> #include <linux/mm.h> #include <linux/stat.h> #include <linux/fcntl.h>
@@ -423,7 +424,9 @@ static int coredump_wait(int exit_code, struct core_state *core_state)if (core_waiters >0 ) {struct core_thread *ptr; +freezer_do_not_count ();wait_for_completion (&core_state->startup); +freezer_count ();/* * Wait for all the threads to become inactive, so that * all the thread context (extended register state, like
fs/nfs/nfs4session.c +6 -4
@@ -178,12 +178,14 @@ static int nfs4_slot_get_seqid(struct nfs4_slot_table *tbl, u32 slotid, __must_hold(&tbl->slot_tbl_lock) {struct nfs4_slot *slot; +int ret; slot =nfs4_lookup_slot (tbl, slotid); -if (IS_ERR (slot)) -return PTR_ERR (slot); - *seq_nr = slot->seq_nr; -return 0 ; + ret =PTR_ERR_OR_ZERO (slot); +if (!ret) + *seq_nr = slot->seq_nr; + +return ret; }/*
include/linux/acpi.h +1 -0
@@ -318,6 +318,7 @@ struct pci_dev;int acpi_pci_irq_enable (struct pci_dev *dev);void acpi_penalize_isa_irq (int irq,int active);bool acpi_isa_irq_available (int irq); +void acpi_penalize_sci_irq (int irq,int trigger,int polarity);void acpi_pci_irq_disable (struct pci_dev *dev);extern int ec_read (u8 addr,u8 *val);
include/linux/frontswap.h +3 -2
@@ -106,8 +106,9 @@ static inline void frontswap_invalidate_area(unsigned type)static inline void frontswap_init (unsigned type,unsigned long *map) { -if (frontswap_enabled ()) -__frontswap_init (type, map); +#ifdef CONFIG_FRONTSWAP +__frontswap_init (type, map); +#endif }#endif /* _LINUX_FRONTSWAP_H */
include/linux/sunrpc/svc_rdma.h +9 -0
@@ -86,6 +86,7 @@ struct svc_rdma_op_ctxt {unsigned long flags;enum dma_data_direction direction;int count; +unsigned int mapped_sges;struct ib_sge sge[RPCSVC_MAXPAGES ];struct page *pages[RPCSVC_MAXPAGES ]; };
@@ -193,6 +194,14 @@ struct svcxprt_rdma {#define RPCSVC_MAXPAYLOAD_RDMA RPCSVC_MAXPAYLOAD +/* Track DMA maps for this transport and context */ +static inline void svc_rdma_count_mappings (struct svcxprt_rdma *rdma, +struct svc_rdma_op_ctxt *ctxt) +{ + ctxt->mapped_sges++; +atomic_inc (&rdma->sc_dma_used); +} +/* svc_rdma_backchannel.c */ extern int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, struct rpcrdma_msg *rmsgp,
lib/genalloc.c +2 -1
@@ -292,7 +292,7 @@ unsigned long gen_pool_alloc_algo(struct gen_pool *pool, size_t size,struct gen_pool_chunk *chunk;unsigned long addr =0 ;int order = pool->min_alloc_order; -int nbits, start_bit =0 , end_bit, remain; +int nbits, start_bit, end_bit, remain;#ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG BUG_ON (in_nmi ());
@@ -307,6 +307,7 @@ unsigned long gen_pool_alloc_algo(struct gen_pool *pool, size_t size,if (size >atomic_read (&chunk->avail))continue ; + start_bit =0 ; end_bit =chunk_size (chunk) >> order; retry: start_bit = algo(chunk->bits, end_bit, start_bit,
mm/hugetlb.c +66 -0
101 lines not on this page · raw message
mm/memory-failure.c +5 -7
@@ -1112,10 +1112,10 @@ int memory_failure(unsigned long pfn, int trapno, int flags) }if (!PageHuge (p) &&PageTransHuge (hpage)) { -lock_page (hpage); -if (!PageAnon (hpage) ||unlikely (split_huge_page (hpage))) { -unlock_page (hpage); -if (!PageAnon (hpage)) +lock_page (p); +if (!PageAnon (p) ||unlikely (split_huge_page (p))) { +unlock_page (p); +if (!PageAnon (p))pr_err ("Memory failure: %#lx: non anonymous thp\n" , pfn);else
@@ -1126,9 +1126,7 @@ int memory_failure(unsigned long pfn, int trapno, int flags)put_hwpoison_page (p);return -EBUSY ; } -unlock_page (hpage); -get_hwpoison_page (p); -put_hwpoison_page (hpage); +unlock_page (p);VM_BUG_ON_PAGE (!page_count (p), p); hpage =compound_head (p); }
mm/shmem.c +2 -0
@@ -1483,6 +1483,8 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp,copy_highpage (newpage, oldpage);flush_dcache_page (newpage); +__SetPageLocked (newpage); +__SetPageSwapBacked (newpage);SetPageUptodate (newpage);set_page_private (newpage, swap_index);SetPageSwapCache (newpage);
mm/slab_common.c +2 -2
@@ -533,8 +533,8 @@ void memcg_create_kmem_cache(struct mem_cgroup *memcg, s =create_cache (cache_name, root_cache->object_size, root_cache->size, root_cache->align, - root_cache->flags, root_cache->ctor, - memcg, root_cache); + root_cache->flags &CACHE_CREATE_MASK , + root_cache->ctor, memcg, root_cache);/* * If we could not create a memcg cache, do not complain, because * that's not critical at all as we can always proceed with the root
mm/swapfile.c +2 -0
@@ -2218,6 +2218,8 @@ static unsigned long read_swap_header(struct swap_info_struct *p,swab32s (&swap_header->info.version);swab32s (&swap_header->info.last_page);swab32s (&swap_header->info.nr_badpages); +if (swap_header->info.nr_badpages >MAX_SWAP_BADPAGES ) +return 0 ;for (i =0 ; i < swap_header->info.nr_badpages; i++)swab32s (&swap_header->info.badpages[i]); }
net/batman-adv/originator.c +1 -1
@@ -537,7 +537,7 @@ batadv_hardif_neigh_create(struct batadv_hard_iface *hard_iface,if (bat_priv->algo_ops->neigh.hardif_init) bat_priv->algo_ops->neigh.hardif_init (hardif_neigh); -hlist_add_head (&hardif_neigh->list, &hard_iface->neigh_list); +hlist_add_head_rcu (&hardif_neigh->list, &hard_iface->neigh_list); out:spin_unlock_bh (&hard_iface->neigh_list_lock);
net/ceph/ceph_fs.c +2 -1
@@ -34,7 +34,8 @@ void ceph_file_layout_from_legacy(struct ceph_file_layout *fl, fl->stripe_count =le32_to_cpu (legacy->fl_stripe_count); fl->object_size =le32_to_cpu (legacy->fl_object_size); fl->pool_id =le32_to_cpu (legacy->fl_pg_pool); -if (fl->pool_id ==0 ) +if (fl->pool_id ==0 && fl->stripe_unit ==0 && + fl->stripe_count ==0 && fl->object_size ==0 ) fl->pool_id =-1 ; }EXPORT_SYMBOL (ceph_file_layout_from_legacy);
net/netfilter/nf_log.c +4 -2
@@ -420,7 +420,7 @@ static int nf_log_proc_dostring(struct ctl_table *table, int write,char buf[NFLOGGER_NAME_LEN ];int r =0 ;int tindex = (unsigned long )table->extra1; -struct net *net = current->nsproxy->net_ns; +struct net *net = table->extra2;if (write) {struct ctl_table tmp = *table;
@@ -474,7 +474,6 @@ static int netfilter_log_sysctl_init(struct net *net) 3, "%d", i); nf_log_sysctl_table[i].procname = nf_log_sysctl_fnames[i]; - nf_log_sysctl_table[i].data =NULL ; nf_log_sysctl_table[i].maxlen =NFLOGGER_NAME_LEN ; nf_log_sysctl_table[i].mode =0644 ; nf_log_sysctl_table[i].proc_handler =
@@ -484,6 +483,9 @@ static int netfilter_log_sysctl_init(struct net *net) } } +for (i =NFPROTO_UNSPEC ; i <NFPROTO_NUMPROTO ; i++) + table[i].extra2 = net; + net->nf.nf_log_dir_header =register_net_sysctl (net,"net/netfilter/nf_log" , table);
net/sunrpc/xprtrdma/frwr_ops.c +23 -16
@@ -44,18 +44,20 @@* being done. * * When the underlying transport disconnects, MRs are left in one of -* three states: +* four states: * * INVALID: The MR was not in use before the QP entered ERROR state. -* (Or, the LOCAL_INV WR has not completed or flushed yet). -* -* STALE: The MR was being registered or unregistered when the QP -* entered ERROR state, and the pending WR was flushed. * * VALID: The MR was registered before the QP entered ERROR state. * -* When frwr_op_map encounters STALE and VALID MRs, they are recovered -* with ib_dereg_mr and then are re-initialized. Beause MR recovery +* FLUSHED_FR: The MR was being registered when the QP entered ERROR +* state, and the pending WR was flushed. +* +* FLUSHED_LI: The MR was being invalidated when the QP entered ERROR +* state, and the pending WR was flushed. +* +* When frwr_op_map encounters FLUSHED and VALID MRs, they are recovered +* with ib_dereg_mr and then are re-initialized. Because MR recovery * allocates fresh resources, it is deferred to a workqueue, and the * recovered MRs are placed back on the rb_mws list when recovery is * complete. frwr_op_map allocates another MR for the current RPC while
@@ -175,12 +177,15 @@ __frwr_reset_mr(struct rpcrdma_ia *ia, struct rpcrdma_mw *r)static void frwr_op_recover_mr (struct rpcrdma_mw *mw) { +enum rpcrdma_frmr_state state = mw->frmr.fr_state;struct rpcrdma_xprt *r_xprt = mw->mw_xprt;struct rpcrdma_ia *ia = &r_xprt->rx_ia;int rc; rc =__frwr_reset_mr (ia, mw); -ib_dma_unmap_sg (ia->ri_device, mw->mw_sg, mw->mw_nents, mw->mw_dir); +if (state !=FRMR_FLUSHED_LI ) +ib_dma_unmap_sg (ia->ri_device, + mw->mw_sg, mw->mw_nents, mw->mw_dir);if (rc) goto out_release;
@@ -261,10 +266,8 @@ frwr_op_maxpages(struct rpcrdma_xprt *r_xprt) }static void -__frwr_sendcompletion_flush (struct ib_wc *wc,struct rpcrdma_frmr *frmr, -const char *wr) +__frwr_sendcompletion_flush (struct ib_wc *wc,const char *wr) { - frmr->fr_state =FRMR_IS_STALE ;if (wc->status !=IB_WC_WR_FLUSH_ERR ) pr_err("rpcrdma: %s: %s (%u/0x%x)\n", wr, ib_wc_status_msg(wc->status),
@@ -287,7 +290,8 @@ frwr_wc_fastreg(struct ib_cq *cq, struct ib_wc *wc)if (wc->status !=IB_WC_SUCCESS ) { cqe = wc->wr_cqe; frmr = container_of(cqe, struct rpcrdma_frmr, fr_cqe); -__frwr_sendcompletion_flush (wc, frmr,"fastreg" ); + frmr->fr_state =FRMR_FLUSHED_FR ; +__frwr_sendcompletion_flush (wc,"fastreg" ); } }
@@ -307,7 +311,8 @@ frwr_wc_localinv(struct ib_cq *cq, struct ib_wc *wc)if (wc->status !=IB_WC_SUCCESS ) { cqe = wc->wr_cqe; frmr = container_of(cqe, struct rpcrdma_frmr, fr_cqe); -__frwr_sendcompletion_flush (wc, frmr,"localinv" ); + frmr->fr_state =FRMR_FLUSHED_LI ; +__frwr_sendcompletion_flush (wc,"localinv" ); } }
@@ -327,9 +332,11 @@ frwr_wc_localinv_wake(struct ib_cq *cq, struct ib_wc *wc)/* WARNING: Only wr_cqe and status are reliable at this point */ cqe = wc->wr_cqe; frmr = container_of(cqe, struct rpcrdma_frmr, fr_cqe); -if (wc->status !=IB_WC_SUCCESS ) -__frwr_sendcompletion_flush (wc, frmr,"localinv" ); -complete_all (&frmr->fr_linv_done); +if (wc->status !=IB_WC_SUCCESS ) { + frmr->fr_state =FRMR_FLUSHED_LI ; +__frwr_sendcompletion_flush (wc,"localinv" ); + } +complete (&frmr->fr_linv_done); }/* Post a REG_MR Work Request to register a memory region
net/sunrpc/xprtrdma/svc_rdma_backchannel.c +1 -1
@@ -129,7 +129,7 @@ static int svc_rdma_bc_sendto(struct svcxprt_rdma *rdma, ret = -EIO ; goto out_unmap; } -atomic_inc (&rdma->sc_dma_used); +svc_rdma_count_mappings (rdma, ctxt);memset (&send_wr,0 ,sizeof (send_wr)); ctxt->cqe.done = svc_rdma_wc_send;
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +1 -1
@@ -159,7 +159,7 @@ int rdma_read_chunk_lcl(struct svcxprt_rdma *xprt, ctxt->sge[pno].addr);if (ret) goto err; -atomic_inc (&xprt->sc_dma_used); +svc_rdma_count_mappings (xprt, ctxt); ctxt->sge[pno].lkey = xprt->sc_pd->local_dma_lkey; ctxt->sge[pno].length = len;
net/sunrpc/xprtrdma/svc_rdma_sendto.c +5 -19
@@ -280,7 +280,7 @@ static int send_write(struct svcxprt_rdma *xprt, struct svc_rqst *rqstp,if (ib_dma_mapping_error (xprt->sc_cm_id->device, sge[sge_no].addr)) goto err; -atomic_inc (&xprt->sc_dma_used); +svc_rdma_count_mappings (xprt, ctxt); sge[sge_no].lkey = xprt->sc_pd->local_dma_lkey; ctxt->count++; sge_off =0 ;
@@ -489,7 +489,7 @@ static int send_reply(struct svcxprt_rdma *rdma, ctxt->sge[0].length, DMA_TO_DEVICE);if (ib_dma_mapping_error (rdma->sc_cm_id->device, ctxt->sge[0 ].addr)) goto err; -atomic_inc (&rdma->sc_dma_used); +svc_rdma_count_mappings (rdma, ctxt); ctxt->direction =DMA_TO_DEVICE ;
@@ -505,7 +505,7 @@ static int send_reply(struct svcxprt_rdma *rdma,if (ib_dma_mapping_error (rdma->sc_cm_id->device, ctxt->sge[sge_no].addr)) goto err; -atomic_inc (&rdma->sc_dma_used); +svc_rdma_count_mappings (rdma, ctxt); ctxt->sge[sge_no].lkey = rdma->sc_pd->local_dma_lkey; ctxt->sge[sge_no].length = sge_bytes; }
@@ -523,23 +523,9 @@ static int send_reply(struct svcxprt_rdma *rdma, ctxt->pages[page_no+1 ] = rqstp->rq_respages[page_no]; ctxt->count++; rqstp->rq_respages[page_no] =NULL ; -/* -* If there are more pages than SGE, terminate SGE -* list so that svc_rdma_unmap_dma doesn't attempt to -* unmap garbage. -*/ -if (page_no+1 >= sge_no) - ctxt->sge[page_no+1 ].length =0 ; } rqstp->rq_next_page = rqstp->rq_respages +1 ; -/* The loop above bumps sc_dma_used for each sge. The -* xdr_buf.tail gets a separate sge, but resides in the -* same page as xdr_buf.head. Don't count it twice. -*/ -if (sge_no > ctxt->count) -atomic_dec (&rdma->sc_dma_used); -if (sge_no > rdma->sc_max_sge) {pr_err ("svcrdma: Too many sges (%d)\n" , sge_no); goto err;
@@ -635,7 +621,7 @@ int svc_rdma_sendto(struct svc_rqst *rqstp) ret =send_reply (rdma, rqstp, res_page, rdma_resp, vec, inline_bytes);if (ret <0 ) - goto err1; + goto err0;svc_rdma_put_req_map (rdma, vec);dprintk ("svcrdma: send_reply returns %d\n" , ret);
@@ -692,7 +678,7 @@ void svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp,svc_rdma_put_context (ctxt,1 );return ; } -atomic_inc (&xprt->sc_dma_used); +svc_rdma_count_mappings (xprt, ctxt);/* Prepare SEND WR */ memset (&err_wr,0 ,sizeof (err_wr));
net/sunrpc/xprtrdma/svc_rdma_transport.c +12 -6
@@ -198,6 +198,7 @@ struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt) out: ctxt->count =0 ; + ctxt->mapped_sges =0 ; ctxt->frmr =NULL ;return ctxt;
@@ -221,22 +222,27 @@ out_empty:void svc_rdma_unmap_dma (struct svc_rdma_op_ctxt *ctxt) {struct svcxprt_rdma *xprt = ctxt->xprt; -int i; -for (i =0 ; i < ctxt->count && ctxt->sge[i].length; i++) { +struct ib_device *device = xprt->sc_cm_id->device; +u32 lkey = xprt->sc_pd->local_dma_lkey; +unsigned int i, count; + +for (count =0 , i =0 ; i < ctxt->mapped_sges; i++) {/* * Unmap the DMA addr in the SGE if the lkey matches * the local_dma_lkey, otherwise, ignore it since it is * an FRMR lkey and will be unmapped later when the * last WR that uses it completes. */ -if (ctxt->sge[i].lkey == xprt->sc_pd->local_dma_lkey) { -atomic_dec (&xprt->sc_dma_used); -ib_dma_unmap_page (xprt->sc_cm_id->device, +if (ctxt->sge[i].lkey == lkey) { + count++; +ib_dma_unmap_page (device, ctxt->sge[i].addr, ctxt->sge[i].length, ctxt->direction); } } + ctxt->mapped_sges =0 ; +atomic_sub (count, &xprt->sc_dma_used); }void svc_rdma_put_context (struct svc_rdma_op_ctxt *ctxt,int free_pages)
@@ -600,7 +606,7 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags) DMA_FROM_DEVICE);if (ib_dma_mapping_error (xprt->sc_cm_id->device, pa)) goto err_put_ctxt; -atomic_inc (&xprt->sc_dma_used); +svc_rdma_count_mappings (xprt, ctxt); ctxt->sge[sge_no].addr = pa; ctxt->sge[sge_no].length =PAGE_SIZE ; ctxt->sge[sge_no].lkey = xprt->sc_pd->local_dma_lkey;
net/sunrpc/xprtrdma/xprt_rdma.h +2 -1
@@ -207,7 +207,8 @@ struct rpcrdma_rep {enum rpcrdma_frmr_state {FRMR_IS_INVALID ,/* ready to be used */ FRMR_IS_VALID ,/* in use */ -FRMR_IS_STALE ,/* failed completion */ +FRMR_FLUSHED_FR ,/* flushed FASTREG WR */ +FRMR_FLUSHED_LI ,/* flushed LOCALINV WR */ };struct rpcrdma_frmr {
sound/core/info.c +8 -1
@@ -325,10 +325,15 @@ static ssize_t snd_info_text_entry_write(struct file *file,size_t next;int err =0 ; +if (!entry->c.text.write) +return -EIO ; pos = *offset;if (!valid_pos (pos, count))return -EIO ; next = pos + count; +/* don't handle too large text inputs */ +if (next >16 *1024 ) +return -EIO ;mutex_lock (&entry->access); buf = data->wbuffer;if (!buf) {
@@ -366,7 +371,9 @@ static int snd_info_seq_show(struct seq_file *seq, void *p)struct snd_info_private_data *data = seq->private;struct snd_info_entry *entry = data->entry; -if (entry->c.text.read) { +if (!entry->c.text.read) { +return -EIO ; + }else { data->rbuffer->buffer = (char *)seq;/* XXX hack! */ entry->c.text.read (entry, data->rbuffer); }
sound/soc/codecs/cs4270.c +4 -4
@@ -148,11 +148,11 @@ SND_SOC_DAPM_OUTPUT("AOUTR"), };static const struct snd_soc_dapm_route cs4270_dapm_routes[] = { - {"Capture" ,NULL ,"AINA" }, - {"Capture" ,NULL ,"AINB" }, + {"Capture" ,NULL ,"AINL" }, + {"Capture" ,NULL ,"AINR" }, - {"AOUTA" ,NULL ,"Playback" }, - {"AOUTB" ,NULL ,"Playback" }, + {"AOUTL" ,NULL ,"Playback" }, + {"AOUTR" ,NULL ,"Playback" }, };/**
sound/soc/intel/skylake/skl.c +1 -2
@@ -785,8 +785,7 @@ static void skl_remove(struct pci_dev *pci)release_firmware (skl->tplg); -if (pci_dev_run_wake (pci)) -pm_runtime_get_noresume (&pci->dev); +pm_runtime_get_noresume (&pci->dev);/* codec removal, invoke bus_device_remove */ snd_hdac_ext_bus_device_remove (ebus);
sound/soc/sunxi/sun4i-codec.c +4 -3
@@ -738,11 +738,11 @@ static struct snd_soc_card *sun4i_codec_create_card(struct device *dev) card =devm_kzalloc (dev,sizeof (*card),GFP_KERNEL );if (!card) -return NULL ; +return ERR_PTR (-ENOMEM ); card->dai_link =sun4i_codec_create_link (dev, &card->num_links);if (!card->dai_link) -return NULL ; +return ERR_PTR (-ENOMEM ); card->dev = dev; card->name ="sun4i-codec" ;
@@ -842,7 +842,8 @@ static int sun4i_codec_probe(struct platform_device *pdev) } card =sun4i_codec_create_card (&pdev->dev); -if (!card) { +if (IS_ERR (card)) { + ret =PTR_ERR (card);dev_err (&pdev->dev,"Failed to create our card\n" ); goto err_unregister_codec; }
tools/perf/ui/browsers/hists.c +2 -1
@@ -595,7 +595,8 @@ int hist_browser__run(struct hist_browser *browser, const char *help)u64 nr_entries; hbt->timer (hbt->arg); -if (hist_browser__has_filter (browser)) +if (hist_browser__has_filter (browser) || + symbol_conf.report_hierarchy)hist_browser__update_nr_entries (browser); nr_entries =hist_browser__nr_entries (browser);
tools/power/cpupower/utils/cpufreq-set.c +2 -5
@@ -296,7 +296,7 @@ int cmd_freq_set(int argc, char **argv)struct cpufreq_affected_cpus *cpus;if (!bitmask_isbitset (cpus_chosen, cpu) || -cpupower_is_cpu_online (cpu)) +cpupower_is_cpu_online (cpu) !=1 )continue ; cpus =cpufreq_get_related_cpus (cpu);
@@ -316,10 +316,7 @@ int cmd_freq_set(int argc, char **argv) cpu <= bitmask_last(cpus_chosen); cpu++) {if (!bitmask_isbitset (cpus_chosen, cpu) || -cpupower_is_cpu_online (cpu)) -continue ; - -if (cpupower_is_cpu_online (cpu) !=1 ) +cpupower_is_cpu_online (cpu) !=1 )continue ;printf (_ ("Setting cpu: %d\n" ), cpu);
virt/kvm/arm/vgic/vgic-mmio.c +27 -14
61 lines not on this page · raw message
virt/kvm/arm/vgic/vgic-mmio.h +7 -7
@@ -50,15 +50,15 @@ extern struct kvm_io_device_ops kvm_io_gic_ops;#define VGIC_ADDR_IRQ_MASK (bits) (((bits) * 1024 / 8) - 1)/* -* (addr & mask) gives us the byte offset for the INT ID, so we want to -* divide this with 'bytes per irq' to get the INT ID, which is given -* by '(bits) / 8'. But we do this with fixed-point-arithmetic and -* take advantage of the fact that division by a fraction equals -* multiplication with the inverted fraction, and scale up both the -* numerator and denominator with 8 to support at most 64 bits per IRQ: +* (addr & mask) gives us the _byte_ offset for the INT ID. +* We multiply this by 8 the get the _bit_ offset, then divide this by +* the number of bits to learn the actual INT ID. +* But instead of a division (which requires a "long long div" implementation), +* we shift by the binary logarithm of <bits>. +* This assumes that <bits> is a power of two. */ #define VGIC_ADDR_TO_INTID (addr, bits) (((addr) & VGIC_ADDR_IRQ_MASK(bits)) * \ - 64 / (bits) / 8) + 8 >> ilog2(bits))/* * Some VGIC registers store per-IRQ information, with a different number