Commit 02b643b6 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge branch 'perf/urgent' into perf/core, to pick up fixes

Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents d1ee8bc1 4c09e0d6
Christoph Hellwig <hch@lst.de>
...@@ -5849,6 +5849,7 @@ S: Odd Fixes ...@@ -5849,6 +5849,7 @@ S: Odd Fixes
KERNEL NFSD, SUNRPC, AND LOCKD SERVERS KERNEL NFSD, SUNRPC, AND LOCKD SERVERS
M: "J. Bruce Fields" <bfields@fieldses.org> M: "J. Bruce Fields" <bfields@fieldses.org>
M: Jeff Layton <jlayton@poochiereds.net>
L: linux-nfs@vger.kernel.org L: linux-nfs@vger.kernel.org
W: http://nfs.sourceforge.net/ W: http://nfs.sourceforge.net/
S: Supported S: Supported
......
VERSION = 4 VERSION = 4
PATCHLEVEL = 2 PATCHLEVEL = 2
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc7 EXTRAVERSION =
NAME = Hurr durr I'ma sheep NAME = Hurr durr I'ma sheep
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -312,6 +312,9 @@ INSTALL_TARGETS = zinstall uinstall install ...@@ -312,6 +312,9 @@ INSTALL_TARGETS = zinstall uinstall install
PHONY += bzImage $(BOOT_TARGETS) $(INSTALL_TARGETS) PHONY += bzImage $(BOOT_TARGETS) $(INSTALL_TARGETS)
bootpImage uImage: zImage
zImage: Image
$(BOOT_TARGETS): vmlinux $(BOOT_TARGETS): vmlinux
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
......
...@@ -96,7 +96,7 @@ __copy_to_user_memcpy(void __user *to, const void *from, unsigned long n) ...@@ -96,7 +96,7 @@ __copy_to_user_memcpy(void __user *to, const void *from, unsigned long n)
} }
/* the mmap semaphore is taken only if not in an atomic context */ /* the mmap semaphore is taken only if not in an atomic context */
atomic = in_atomic(); atomic = faulthandler_disabled();
if (!atomic) if (!atomic)
down_read(&current->mm->mmap_sem); down_read(&current->mm->mmap_sem);
......
...@@ -392,6 +392,7 @@ static struct irq_chip wakeupgen_chip = { ...@@ -392,6 +392,7 @@ static struct irq_chip wakeupgen_chip = {
.irq_mask = wakeupgen_mask, .irq_mask = wakeupgen_mask,
.irq_unmask = wakeupgen_unmask, .irq_unmask = wakeupgen_unmask,
.irq_retrigger = irq_chip_retrigger_hierarchy, .irq_retrigger = irq_chip_retrigger_hierarchy,
.irq_set_type = irq_chip_set_type_parent,
.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND, .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND,
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
.irq_set_affinity = irq_chip_set_affinity_parent, .irq_set_affinity = irq_chip_set_affinity_parent,
......
...@@ -168,8 +168,8 @@ void kvm_inject_dabt(struct kvm_vcpu *vcpu, unsigned long addr) ...@@ -168,8 +168,8 @@ void kvm_inject_dabt(struct kvm_vcpu *vcpu, unsigned long addr)
{ {
if (!(vcpu->arch.hcr_el2 & HCR_RW)) if (!(vcpu->arch.hcr_el2 & HCR_RW))
inject_abt32(vcpu, false, addr); inject_abt32(vcpu, false, addr);
else
inject_abt64(vcpu, false, addr); inject_abt64(vcpu, false, addr);
} }
/** /**
...@@ -184,8 +184,8 @@ void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr) ...@@ -184,8 +184,8 @@ void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr)
{ {
if (!(vcpu->arch.hcr_el2 & HCR_RW)) if (!(vcpu->arch.hcr_el2 & HCR_RW))
inject_abt32(vcpu, true, addr); inject_abt32(vcpu, true, addr);
else
inject_abt64(vcpu, true, addr); inject_abt64(vcpu, true, addr);
} }
/** /**
...@@ -198,6 +198,6 @@ void kvm_inject_undefined(struct kvm_vcpu *vcpu) ...@@ -198,6 +198,6 @@ void kvm_inject_undefined(struct kvm_vcpu *vcpu)
{ {
if (!(vcpu->arch.hcr_el2 & HCR_RW)) if (!(vcpu->arch.hcr_el2 & HCR_RW))
inject_undef32(vcpu); inject_undef32(vcpu);
else
inject_undef64(vcpu); inject_undef64(vcpu);
} }
...@@ -407,7 +407,7 @@ NESTED(nmi_handler, PT_SIZE, sp) ...@@ -407,7 +407,7 @@ NESTED(nmi_handler, PT_SIZE, sp)
.set noat .set noat
SAVE_ALL SAVE_ALL
FEXPORT(handle_\exception\ext) FEXPORT(handle_\exception\ext)
__BUILD_clear_\clear __build_clear_\clear
.set at .set at
__BUILD_\verbose \exception __BUILD_\verbose \exception
move a0, sp move a0, sp
......
...@@ -191,6 +191,9 @@ struct pci_dev *of_create_pci_dev(struct device_node *node, ...@@ -191,6 +191,9 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
pci_device_add(dev, bus); pci_device_add(dev, bus);
/* Setup MSI caps & disable MSI/MSI-X interrupts */
pci_msi_setup_pci_dev(dev);
return dev; return dev;
} }
EXPORT_SYMBOL(of_create_pci_dev); EXPORT_SYMBOL(of_create_pci_dev);
......
...@@ -79,12 +79,12 @@ do { \ ...@@ -79,12 +79,12 @@ do { \
#else /* CONFIG_X86_32 */ #else /* CONFIG_X86_32 */
/* frame pointer must be last for get_wchan */ /* frame pointer must be last for get_wchan */
#define SAVE_CONTEXT "pushq %%rbp ; movq %%rsi,%%rbp\n\t" #define SAVE_CONTEXT "pushf ; pushq %%rbp ; movq %%rsi,%%rbp\n\t"
#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp\t" #define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp ; popf\t"
#define __EXTRA_CLOBBER \ #define __EXTRA_CLOBBER \
, "rcx", "rbx", "rdx", "r8", "r9", "r10", "r11", \ , "rcx", "rbx", "rdx", "r8", "r9", "r10", "r11", \
"r12", "r13", "r14", "r15", "flags" "r12", "r13", "r14", "r15"
#ifdef CONFIG_CC_STACKPROTECTOR #ifdef CONFIG_CC_STACKPROTECTOR
#define __switch_canary \ #define __switch_canary \
...@@ -100,11 +100,7 @@ do { \ ...@@ -100,11 +100,7 @@ do { \
#define __switch_canary_iparam #define __switch_canary_iparam
#endif /* CC_STACKPROTECTOR */ #endif /* CC_STACKPROTECTOR */
/* /* Save restore flags to clear handle leaking NT */
* There is no need to save or restore flags, because flags are always
* clean in kernel mode, with the possible exception of IOPL. Kernel IOPL
* has no effect.
*/
#define switch_to(prev, next, last) \ #define switch_to(prev, next, last) \
asm volatile(SAVE_CONTEXT \ asm volatile(SAVE_CONTEXT \
"movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \ "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \
......
...@@ -1424,7 +1424,7 @@ static inline void __x2apic_disable(void) ...@@ -1424,7 +1424,7 @@ static inline void __x2apic_disable(void)
{ {
u64 msr; u64 msr;
if (cpu_has_apic) if (!cpu_has_apic)
return; return;
rdmsrl(MSR_IA32_APICBASE, msr); rdmsrl(MSR_IA32_APICBASE, msr);
...@@ -1483,10 +1483,13 @@ void x2apic_setup(void) ...@@ -1483,10 +1483,13 @@ void x2apic_setup(void)
static __init void x2apic_disable(void) static __init void x2apic_disable(void)
{ {
u32 x2apic_id; u32 x2apic_id, state = x2apic_state;
if (x2apic_state != X2APIC_ON) x2apic_mode = 0;
goto out; x2apic_state = X2APIC_DISABLED;
if (state != X2APIC_ON)
return;
x2apic_id = read_apic_id(); x2apic_id = read_apic_id();
if (x2apic_id >= 255) if (x2apic_id >= 255)
...@@ -1494,9 +1497,6 @@ static __init void x2apic_disable(void) ...@@ -1494,9 +1497,6 @@ static __init void x2apic_disable(void)
__x2apic_disable(); __x2apic_disable();
register_lapic_address(mp_lapic_addr); register_lapic_address(mp_lapic_addr);
out:
x2apic_state = X2APIC_DISABLED;
x2apic_mode = 0;
} }
static __init void x2apic_enable(void) static __init void x2apic_enable(void)
......
...@@ -322,7 +322,7 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, ...@@ -322,7 +322,7 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq,
irq_data->chip = &lapic_controller; irq_data->chip = &lapic_controller;
irq_data->chip_data = data; irq_data->chip_data = data;
irq_data->hwirq = virq + i; irq_data->hwirq = virq + i;
err = assign_irq_vector_policy(virq, irq_data->node, data, err = assign_irq_vector_policy(virq + i, irq_data->node, data,
info); info);
if (err) if (err)
goto error; goto error;
......
...@@ -270,7 +270,7 @@ int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu) ...@@ -270,7 +270,7 @@ int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu)
dst_fpu->fpregs_active = 0; dst_fpu->fpregs_active = 0;
dst_fpu->last_cpu = -1; dst_fpu->last_cpu = -1;
if (src_fpu->fpstate_active) if (src_fpu->fpstate_active && cpu_has_fpu)
fpu_copy(dst_fpu, src_fpu); fpu_copy(dst_fpu, src_fpu);
return 0; return 0;
......
...@@ -40,7 +40,12 @@ static void fpu__init_cpu_generic(void) ...@@ -40,7 +40,12 @@ static void fpu__init_cpu_generic(void)
write_cr0(cr0); write_cr0(cr0);
/* Flush out any pending x87 state: */ /* Flush out any pending x87 state: */
asm volatile ("fninit"); #ifdef CONFIG_MATH_EMULATION
if (!cpu_has_fpu)
fpstate_init_soft(&current->thread.fpu.state.soft);
else
#endif
asm volatile ("fninit");
} }
/* /*
......
...@@ -408,6 +408,7 @@ static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c) ...@@ -408,6 +408,7 @@ static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c)
static void mwait_idle(void) static void mwait_idle(void)
{ {
if (!current_set_polling_and_test()) { if (!current_set_polling_and_test()) {
trace_cpu_idle_rcuidle(1, smp_processor_id());
if (this_cpu_has(X86_BUG_CLFLUSH_MONITOR)) { if (this_cpu_has(X86_BUG_CLFLUSH_MONITOR)) {
smp_mb(); /* quirk */ smp_mb(); /* quirk */
clflush((void *)&current_thread_info()->flags); clflush((void *)&current_thread_info()->flags);
...@@ -419,6 +420,7 @@ static void mwait_idle(void) ...@@ -419,6 +420,7 @@ static void mwait_idle(void)
__sti_mwait(0, 0); __sti_mwait(0, 0);
else else
local_irq_enable(); local_irq_enable();
trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
} else { } else {
local_irq_enable(); local_irq_enable();
} }
......
...@@ -8,7 +8,7 @@ config XEN ...@@ -8,7 +8,7 @@ config XEN
select PARAVIRT_CLOCK select PARAVIRT_CLOCK
select XEN_HAVE_PVMMU select XEN_HAVE_PVMMU
depends on X86_64 || (X86_32 && X86_PAE) depends on X86_64 || (X86_32 && X86_PAE)
depends on X86_TSC depends on X86_LOCAL_APIC && X86_TSC
help help
This is the Linux Xen port. Enabling this will allow the This is the Linux Xen port. Enabling this will allow the
kernel to boot in a paravirtualized environment under the kernel to boot in a paravirtualized environment under the
...@@ -17,7 +17,7 @@ config XEN ...@@ -17,7 +17,7 @@ config XEN
config XEN_DOM0 config XEN_DOM0
def_bool y def_bool y
depends on XEN && PCI_XEN && SWIOTLB_XEN depends on XEN && PCI_XEN && SWIOTLB_XEN
depends on X86_LOCAL_APIC && X86_IO_APIC && ACPI && PCI depends on X86_IO_APIC && ACPI && PCI
config XEN_PVHVM config XEN_PVHVM
def_bool y def_bool y
......
...@@ -702,11 +702,11 @@ static ssize_t flags_show(struct device *dev, ...@@ -702,11 +702,11 @@ static ssize_t flags_show(struct device *dev,
u16 flags = to_nfit_memdev(dev)->flags; u16 flags = to_nfit_memdev(dev)->flags;
return sprintf(buf, "%s%s%s%s%s\n", return sprintf(buf, "%s%s%s%s%s\n",
flags & ACPI_NFIT_MEM_SAVE_FAILED ? "save " : "", flags & ACPI_NFIT_MEM_SAVE_FAILED ? "save_fail " : "",
flags & ACPI_NFIT_MEM_RESTORE_FAILED ? "restore " : "", flags & ACPI_NFIT_MEM_RESTORE_FAILED ? "restore_fail " : "",
flags & ACPI_NFIT_MEM_FLUSH_FAILED ? "flush " : "", flags & ACPI_NFIT_MEM_FLUSH_FAILED ? "flush_fail " : "",
flags & ACPI_NFIT_MEM_ARMED ? "arm " : "", flags & ACPI_NFIT_MEM_ARMED ? "not_armed " : "",
flags & ACPI_NFIT_MEM_HEALTH_OBSERVED ? "smart " : ""); flags & ACPI_NFIT_MEM_HEALTH_OBSERVED ? "smart_event " : "");
} }
static DEVICE_ATTR_RO(flags); static DEVICE_ATTR_RO(flags);
...@@ -849,12 +849,12 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc) ...@@ -849,12 +849,12 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
if ((mem_flags & ACPI_NFIT_MEM_FAILED_MASK) == 0) if ((mem_flags & ACPI_NFIT_MEM_FAILED_MASK) == 0)
continue; continue;
dev_info(acpi_desc->dev, "%s: failed: %s%s%s%s\n", dev_info(acpi_desc->dev, "%s flags:%s%s%s%s\n",
nvdimm_name(nvdimm), nvdimm_name(nvdimm),
mem_flags & ACPI_NFIT_MEM_SAVE_FAILED ? "save " : "", mem_flags & ACPI_NFIT_MEM_SAVE_FAILED ? " save_fail" : "",
mem_flags & ACPI_NFIT_MEM_RESTORE_FAILED ? "restore " : "", mem_flags & ACPI_NFIT_MEM_RESTORE_FAILED ? " restore_fail":"",
mem_flags & ACPI_NFIT_MEM_FLUSH_FAILED ? "flush " : "", mem_flags & ACPI_NFIT_MEM_FLUSH_FAILED ? " flush_fail" : "",
mem_flags & ACPI_NFIT_MEM_ARMED ? "arm " : ""); mem_flags & ACPI_NFIT_MEM_ARMED ? " not_armed" : "");
} }
...@@ -1024,7 +1024,7 @@ static void wmb_blk(struct nfit_blk *nfit_blk) ...@@ -1024,7 +1024,7 @@ static void wmb_blk(struct nfit_blk *nfit_blk)
wmb_pmem(); wmb_pmem();
} }
static u64 read_blk_stat(struct nfit_blk *nfit_blk, unsigned int bw) static u32 read_blk_stat(struct nfit_blk *nfit_blk, unsigned int bw)
{ {
struct nfit_blk_mmio *mmio = &nfit_blk->mmio[DCR]; struct nfit_blk_mmio *mmio = &nfit_blk->mmio[DCR];
u64 offset = nfit_blk->stat_offset + mmio->size * bw; u64 offset = nfit_blk->stat_offset + mmio->size * bw;
...@@ -1032,7 +1032,7 @@ static u64 read_blk_stat(struct nfit_blk *nfit_blk, unsigned int bw) ...@@ -1032,7 +1032,7 @@ static u64 read_blk_stat(struct nfit_blk *nfit_blk, unsigned int bw)
if (mmio->num_lines) if (mmio->num_lines)
offset = to_interleave_offset(offset, mmio); offset = to_interleave_offset(offset, mmio);
return readq(mmio->base + offset); return readl(mmio->base + offset);
} }
static void write_blk_ctl(struct nfit_blk *nfit_blk, unsigned int bw, static void write_blk_ctl(struct nfit_blk *nfit_blk, unsigned int bw,
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/workqueue.h>
#include <acpi/video.h> #include <acpi/video.h>
ACPI_MODULE_NAME("video"); ACPI_MODULE_NAME("video");
...@@ -41,6 +42,7 @@ void acpi_video_unregister_backlight(void); ...@@ -41,6 +42,7 @@ void acpi_video_unregister_backlight(void);
static bool backlight_notifier_registered; static bool backlight_notifier_registered;
static struct notifier_block backlight_nb; static struct notifier_block backlight_nb;
static struct work_struct backlight_notify_work;
static enum acpi_backlight_type acpi_backlight_cmdline = acpi_backlight_undef; static enum acpi_backlight_type acpi_backlight_cmdline = acpi_backlight_undef;
static enum acpi_backlight_type acpi_backlight_dmi = acpi_backlight_undef; static enum acpi_backlight_type acpi_backlight_dmi = acpi_backlight_undef;
...@@ -262,6 +264,13 @@ static const struct dmi_system_id video_detect_dmi_table[] = { ...@@ -262,6 +264,13 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
{ }, { },
}; };
/* This uses a workqueue to avoid various locking ordering issues */
static void acpi_video_backlight_notify_work(struct work_struct *work)
{
if (acpi_video_get_backlight_type() != acpi_backlight_video)
acpi_video_unregister_backlight();
}
static int acpi_video_backlight_notify(struct notifier_block *nb, static int acpi_video_backlight_notify(struct notifier_block *nb,
unsigned long val, void *bd) unsigned long val, void *bd)
{ {
...@@ -269,9 +278,8 @@ static int acpi_video_backlight_notify(struct notifier_block *nb, ...@@ -269,9 +278,8 @@ static int acpi_video_backlight_notify(struct notifier_block *nb,
/* A raw bl registering may change video -> native */ /* A raw bl registering may change video -> native */
if (backlight->props.type == BACKLIGHT_RAW && if (backlight->props.type == BACKLIGHT_RAW &&
val == BACKLIGHT_REGISTERED && val == BACKLIGHT_REGISTERED)
acpi_video_get_backlight_type() != acpi_backlight_video) schedule_work(&backlight_notify_work);
acpi_video_unregister_backlight();
return NOTIFY_OK; return NOTIFY_OK;
} }
...@@ -304,6 +312,8 @@ enum acpi_backlight_type acpi_video_get_backlight_type(void) ...@@ -304,6 +312,8 @@ enum acpi_backlight_type acpi_video_get_backlight_type(void)
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, find_video, NULL, ACPI_UINT32_MAX, find_video, NULL,
&video_caps, NULL); &video_caps, NULL);
INIT_WORK(&backlight_notify_work,
acpi_video_backlight_notify_work);
backlight_nb.notifier_call = acpi_video_backlight_notify; backlight_nb.notifier_call = acpi_video_backlight_notify;
backlight_nb.priority = 0; backlight_nb.priority = 0;
if (backlight_register_notifier(&backlight_nb) == 0) if (backlight_register_notifier(&backlight_nb) == 0)
......
...@@ -4230,6 +4230,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { ...@@ -4230,6 +4230,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
ATA_HORKAGE_ZERO_AFTER_TRIM, }, ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Samsung SSD 8*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | { "Samsung SSD 8*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, }, ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "FCCT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, },
/* devices that don't properly handle TRIM commands */ /* devices that don't properly handle TRIM commands */
{ "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, },
......
...@@ -3756,6 +3756,14 @@ static int mtip_init_cmd(void *data, struct request *rq, unsigned int hctx_idx, ...@@ -3756,6 +3756,14 @@ static int mtip_init_cmd(void *data, struct request *rq, unsigned int hctx_idx,
struct mtip_cmd *cmd = blk_mq_rq_to_pdu(rq); struct mtip_cmd *cmd = blk_mq_rq_to_pdu(rq);
u32 host_cap_64 = readl(dd->mmio + HOST_CAP) & HOST_CAP_64; u32 host_cap_64 = readl(dd->mmio + HOST_CAP) & HOST_CAP_64;
/*
* For flush requests, request_idx starts at the end of the
* tag space. Since we don't support FLUSH/FUA, simply return
* 0 as there's nothing to be done.
*/
if (request_idx >= MTIP_MAX_COMMAND_SLOTS)
return 0;
cmd->command = dmam_alloc_coherent(&dd->pdev->dev, CMD_DMA_ALLOC_SZ, cmd->command = dmam_alloc_coherent(&dd->pdev->dev, CMD_DMA_ALLOC_SZ,
&cmd->command_dma, GFP_KERNEL); &cmd->command_dma, GFP_KERNEL);
if (!cmd->command) if (!cmd->command)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment