mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-26 00:31:47 +00:00
416 lines
12 KiB
Diff
416 lines
12 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index bbdd7ab3e0e3..e891990fbf1c 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 77
|
|
+SUBLEVEL = 78
|
|
EXTRAVERSION =
|
|
NAME = Saber-toothed Squirrel
|
|
|
|
diff --git a/arch/x86/kernel/cpu/perf_event_amd_ibs.c b/arch/x86/kernel/cpu/perf_event_amd_ibs.c
|
|
index 3b8a2d30d14e..ea34253cb9c6 100644
|
|
--- a/arch/x86/kernel/cpu/perf_event_amd_ibs.c
|
|
+++ b/arch/x86/kernel/cpu/perf_event_amd_ibs.c
|
|
@@ -9,6 +9,7 @@
|
|
#include <linux/perf_event.h>
|
|
#include <linux/module.h>
|
|
#include <linux/pci.h>
|
|
+#include <linux/syscore_ops.h>
|
|
|
|
#include <asm/apic.h>
|
|
|
|
@@ -209,6 +210,18 @@ out:
|
|
return ret;
|
|
}
|
|
|
|
+static void ibs_eilvt_setup(void)
|
|
+{
|
|
+ /*
|
|
+ * Force LVT offset assignment for family 10h: The offsets are
|
|
+ * not assigned by the BIOS for this family, so the OS is
|
|
+ * responsible for doing it. If the OS assignment fails, fall
|
|
+ * back to BIOS settings and try to setup this.
|
|
+ */
|
|
+ if (boot_cpu_data.x86 == 0x10)
|
|
+ force_ibs_eilvt_setup();
|
|
+}
|
|
+
|
|
static inline int get_ibs_lvt_offset(void)
|
|
{
|
|
u64 val;
|
|
@@ -244,6 +257,36 @@ static void clear_APIC_ibs(void *dummy)
|
|
setup_APIC_eilvt(offset, 0, APIC_EILVT_MSG_FIX, 1);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
+
|
|
+static int perf_ibs_suspend(void)
|
|
+{
|
|
+ clear_APIC_ibs(NULL);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void perf_ibs_resume(void)
|
|
+{
|
|
+ ibs_eilvt_setup();
|
|
+ setup_APIC_ibs(NULL);
|
|
+}
|
|
+
|
|
+static struct syscore_ops perf_ibs_syscore_ops = {
|
|
+ .resume = perf_ibs_resume,
|
|
+ .suspend = perf_ibs_suspend,
|
|
+};
|
|
+
|
|
+static void perf_ibs_pm_init(void)
|
|
+{
|
|
+ register_syscore_ops(&perf_ibs_syscore_ops);
|
|
+}
|
|
+
|
|
+#else
|
|
+
|
|
+static inline void perf_ibs_pm_init(void) { }
|
|
+
|
|
+#endif
|
|
+
|
|
static int __cpuinit
|
|
perf_ibs_cpu_notifier(struct notifier_block *self, unsigned long action, void *hcpu)
|
|
{
|
|
@@ -270,18 +313,12 @@ static __init int amd_ibs_init(void)
|
|
if (!caps)
|
|
return -ENODEV; /* ibs not supported by the cpu */
|
|
|
|
- /*
|
|
- * Force LVT offset assignment for family 10h: The offsets are
|
|
- * not assigned by the BIOS for this family, so the OS is
|
|
- * responsible for doing it. If the OS assignment fails, fall
|
|
- * back to BIOS settings and try to setup this.
|
|
- */
|
|
- if (boot_cpu_data.x86 == 0x10)
|
|
- force_ibs_eilvt_setup();
|
|
+ ibs_eilvt_setup();
|
|
|
|
if (!ibs_eilvt_valid())
|
|
goto out;
|
|
|
|
+ perf_ibs_pm_init();
|
|
get_online_cpus();
|
|
ibs_caps = caps;
|
|
/* make ibs_caps visible to other cpus: */
|
|
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
|
|
index 858432287ab6..2bf03a99c2f9 100644
|
|
--- a/arch/x86/kvm/lapic.c
|
|
+++ b/arch/x86/kvm/lapic.c
|
|
@@ -1278,14 +1278,12 @@ void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu)
|
|
void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu)
|
|
{
|
|
u32 data;
|
|
- void *vapic;
|
|
|
|
if (!irqchip_in_kernel(vcpu->kvm) || !vcpu->arch.apic->vapic_addr)
|
|
return;
|
|
|
|
- vapic = kmap_atomic(vcpu->arch.apic->vapic_page);
|
|
- data = *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr));
|
|
- kunmap_atomic(vapic);
|
|
+ kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data,
|
|
+ sizeof(u32));
|
|
|
|
apic_set_tpr(vcpu->arch.apic, data & 0xff);
|
|
}
|
|
@@ -1295,7 +1293,6 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu)
|
|
u32 data, tpr;
|
|
int max_irr, max_isr;
|
|
struct kvm_lapic *apic;
|
|
- void *vapic;
|
|
|
|
if (!irqchip_in_kernel(vcpu->kvm) || !vcpu->arch.apic->vapic_addr)
|
|
return;
|
|
@@ -1310,17 +1307,24 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu)
|
|
max_isr = 0;
|
|
data = (tpr & 0xff) | ((max_isr & 0xf0) << 8) | (max_irr << 24);
|
|
|
|
- vapic = kmap_atomic(vcpu->arch.apic->vapic_page);
|
|
- *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr)) = data;
|
|
- kunmap_atomic(vapic);
|
|
+ kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data,
|
|
+ sizeof(u32));
|
|
}
|
|
|
|
-void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr)
|
|
+int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr)
|
|
{
|
|
if (!irqchip_in_kernel(vcpu->kvm))
|
|
- return;
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (vapic_addr) {
|
|
+ if (kvm_gfn_to_hva_cache_init(vcpu->kvm,
|
|
+ &vcpu->arch.apic->vapic_cache,
|
|
+ vapic_addr, sizeof(u32)))
|
|
+ return -EINVAL;
|
|
+ }
|
|
|
|
vcpu->arch.apic->vapic_addr = vapic_addr;
|
|
+ return 0;
|
|
}
|
|
|
|
int kvm_x2apic_msr_write(struct kvm_vcpu *vcpu, u32 msr, u64 data)
|
|
diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h
|
|
index 6f4ce2575d09..6aec0714398e 100644
|
|
--- a/arch/x86/kvm/lapic.h
|
|
+++ b/arch/x86/kvm/lapic.h
|
|
@@ -15,7 +15,7 @@ struct kvm_lapic {
|
|
bool irr_pending;
|
|
void *regs;
|
|
gpa_t vapic_addr;
|
|
- struct page *vapic_page;
|
|
+ struct gfn_to_hva_cache vapic_cache;
|
|
};
|
|
int kvm_create_lapic(struct kvm_vcpu *vcpu);
|
|
void kvm_free_lapic(struct kvm_vcpu *vcpu);
|
|
@@ -46,7 +46,7 @@ int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu);
|
|
u64 kvm_get_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu);
|
|
void kvm_set_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu, u64 data);
|
|
|
|
-void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr);
|
|
+int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr);
|
|
void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu);
|
|
void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu);
|
|
|
|
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
|
index 3663e0b38976..4b1be290f6e3 100644
|
|
--- a/arch/x86/kvm/x86.c
|
|
+++ b/arch/x86/kvm/x86.c
|
|
@@ -2728,8 +2728,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
|
r = -EFAULT;
|
|
if (copy_from_user(&va, argp, sizeof va))
|
|
goto out;
|
|
- r = 0;
|
|
- kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr);
|
|
+ r = kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr);
|
|
break;
|
|
}
|
|
case KVM_X86_SETUP_MCE: {
|
|
@@ -5075,33 +5074,6 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu)
|
|
!kvm_event_needs_reinjection(vcpu);
|
|
}
|
|
|
|
-static void vapic_enter(struct kvm_vcpu *vcpu)
|
|
-{
|
|
- struct kvm_lapic *apic = vcpu->arch.apic;
|
|
- struct page *page;
|
|
-
|
|
- if (!apic || !apic->vapic_addr)
|
|
- return;
|
|
-
|
|
- page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT);
|
|
-
|
|
- vcpu->arch.apic->vapic_page = page;
|
|
-}
|
|
-
|
|
-static void vapic_exit(struct kvm_vcpu *vcpu)
|
|
-{
|
|
- struct kvm_lapic *apic = vcpu->arch.apic;
|
|
- int idx;
|
|
-
|
|
- if (!apic || !apic->vapic_addr)
|
|
- return;
|
|
-
|
|
- idx = srcu_read_lock(&vcpu->kvm->srcu);
|
|
- kvm_release_page_dirty(apic->vapic_page);
|
|
- mark_page_dirty(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT);
|
|
- srcu_read_unlock(&vcpu->kvm->srcu, idx);
|
|
-}
|
|
-
|
|
static void update_cr8_intercept(struct kvm_vcpu *vcpu)
|
|
{
|
|
int max_irr, tpr;
|
|
@@ -5385,7 +5357,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
|
|
}
|
|
|
|
vcpu->srcu_idx = srcu_read_lock(&kvm->srcu);
|
|
- vapic_enter(vcpu);
|
|
|
|
r = 1;
|
|
while (r > 0) {
|
|
@@ -5442,8 +5413,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
|
|
|
|
srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx);
|
|
|
|
- vapic_exit(vcpu);
|
|
-
|
|
return r;
|
|
}
|
|
|
|
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
|
|
index 0f52799973d4..fac07d3ae4f3 100644
|
|
--- a/drivers/hwmon/coretemp.c
|
|
+++ b/drivers/hwmon/coretemp.c
|
|
@@ -53,7 +53,7 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius");
|
|
|
|
#define BASE_SYSFS_ATTR_NO 2 /* Sysfs Base attr no for coretemp */
|
|
#define NUM_REAL_CORES 32 /* Number of Real cores per cpu */
|
|
-#define CORETEMP_NAME_LENGTH 17 /* String Length of attrs */
|
|
+#define CORETEMP_NAME_LENGTH 19 /* String Length of attrs */
|
|
#define MAX_CORE_ATTRS 4 /* Maximum no of basic attrs */
|
|
#define TOTAL_ATTRS (MAX_CORE_ATTRS + 1)
|
|
#define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO)
|
|
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
|
|
index 99a102d186ce..67a8393e3f86 100644
|
|
--- a/drivers/md/raid10.c
|
|
+++ b/drivers/md/raid10.c
|
|
@@ -1117,7 +1117,7 @@ read_again:
|
|
/* Could not read all from this device, so we will
|
|
* need another r10_bio.
|
|
*/
|
|
- sectors_handled = (r10_bio->sectors + max_sectors
|
|
+ sectors_handled = (r10_bio->sector + max_sectors
|
|
- bio->bi_sector);
|
|
r10_bio->sectors = max_sectors;
|
|
spin_lock_irq(&conf->device_lock);
|
|
@@ -1125,7 +1125,7 @@ read_again:
|
|
bio->bi_phys_segments = 2;
|
|
else
|
|
bio->bi_phys_segments++;
|
|
- spin_unlock(&conf->device_lock);
|
|
+ spin_unlock_irq(&conf->device_lock);
|
|
/* Cannot call generic_make_request directly
|
|
* as that will be queued in __generic_make_request
|
|
* and subsequent mempool_alloc might block
|
|
@@ -2943,10 +2943,6 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
|
|
if (j == conf->copies) {
|
|
/* Cannot recover, so abort the recovery or
|
|
* record a bad block */
|
|
- put_buf(r10_bio);
|
|
- if (rb2)
|
|
- atomic_dec(&rb2->remaining);
|
|
- r10_bio = rb2;
|
|
if (any_working) {
|
|
/* problem is that there are bad blocks
|
|
* on other device(s)
|
|
@@ -2978,6 +2974,10 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
|
|
mirror->recovery_disabled
|
|
= mddev->recovery_disabled;
|
|
}
|
|
+ put_buf(r10_bio);
|
|
+ if (rb2)
|
|
+ atomic_dec(&rb2->remaining);
|
|
+ r10_bio = rb2;
|
|
break;
|
|
}
|
|
}
|
|
diff --git a/drivers/staging/comedi/drivers/cb_pcidio.c b/drivers/staging/comedi/drivers/cb_pcidio.c
|
|
index 8f3215239a15..453ea2d57346 100644
|
|
--- a/drivers/staging/comedi/drivers/cb_pcidio.c
|
|
+++ b/drivers/staging/comedi/drivers/cb_pcidio.c
|
|
@@ -56,10 +56,6 @@ struct pcidio_board {
|
|
const char *name; /* name of the board */
|
|
int dev_id;
|
|
int n_8255; /* number of 8255 chips on board */
|
|
-
|
|
- /* indices of base address regions */
|
|
- int pcicontroler_badrindex;
|
|
- int dioregs_badrindex;
|
|
};
|
|
|
|
static const struct pcidio_board pcidio_boards[] = {
|
|
@@ -67,22 +63,16 @@ static const struct pcidio_board pcidio_boards[] = {
|
|
.name = "pci-dio24",
|
|
.dev_id = 0x0028,
|
|
.n_8255 = 1,
|
|
- .pcicontroler_badrindex = 1,
|
|
- .dioregs_badrindex = 2,
|
|
},
|
|
{
|
|
.name = "pci-dio24h",
|
|
.dev_id = 0x0014,
|
|
.n_8255 = 1,
|
|
- .pcicontroler_badrindex = 1,
|
|
- .dioregs_badrindex = 2,
|
|
},
|
|
{
|
|
.name = "pci-dio48h",
|
|
.dev_id = 0x000b,
|
|
.n_8255 = 2,
|
|
- .pcicontroler_badrindex = 0,
|
|
- .dioregs_badrindex = 1,
|
|
},
|
|
};
|
|
|
|
@@ -239,10 +229,15 @@ found:
|
|
if (comedi_pci_enable(pcidev, thisboard->name))
|
|
return -EIO;
|
|
|
|
- devpriv->dio_reg_base
|
|
- =
|
|
+ /*
|
|
+ * Use PCI BAR 2 region if non-zero length, else use PCI BAR 1 region.
|
|
+ * PCI BAR 1 is only used for older PCI-DIO48H boards. At some point
|
|
+ * the PCI-DIO48H was redesigned to use the same PCI interface chip
|
|
+ * (and same PCI BAR region) as the other boards.
|
|
+ */
|
|
+ devpriv->dio_reg_base =
|
|
pci_resource_start(devpriv->pci_dev,
|
|
- pcidio_boards[index].dioregs_badrindex);
|
|
+ (pci_resource_len(pcidev, 2) ? 2 : 1));
|
|
|
|
/*
|
|
* Allocate the subdevice structures. alloc_subdevice() is a
|
|
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
|
|
index 88e11fb346b6..d4ca8925f017 100644
|
|
--- a/fs/nilfs2/segment.c
|
|
+++ b/fs/nilfs2/segment.c
|
|
@@ -1436,17 +1436,19 @@ static int nilfs_segctor_collect(struct nilfs_sc_info *sci,
|
|
|
|
nilfs_clear_logs(&sci->sc_segbufs);
|
|
|
|
- err = nilfs_segctor_extend_segments(sci, nilfs, nadd);
|
|
- if (unlikely(err))
|
|
- return err;
|
|
-
|
|
if (sci->sc_stage.flags & NILFS_CF_SUFREED) {
|
|
err = nilfs_sufile_cancel_freev(nilfs->ns_sufile,
|
|
sci->sc_freesegs,
|
|
sci->sc_nfreesegs,
|
|
NULL);
|
|
WARN_ON(err); /* do not happen */
|
|
+ sci->sc_stage.flags &= ~NILFS_CF_SUFREED;
|
|
}
|
|
+
|
|
+ err = nilfs_segctor_extend_segments(sci, nilfs, nadd);
|
|
+ if (unlikely(err))
|
|
+ return err;
|
|
+
|
|
nadd = min_t(int, nadd << 1, SC_MAX_SEGDELTA);
|
|
sci->sc_stage = prev_stage;
|
|
}
|
|
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
|
|
index d86fb2057354..7e95698e4139 100644
|
|
--- a/mm/memory-failure.c
|
|
+++ b/mm/memory-failure.c
|
|
@@ -1447,10 +1447,18 @@ static int soft_offline_huge_page(struct page *page, int flags)
|
|
return ret;
|
|
}
|
|
done:
|
|
- if (!PageHWPoison(hpage))
|
|
- atomic_long_add(1 << compound_trans_order(hpage), &mce_bad_pages);
|
|
- set_page_hwpoison_huge_page(hpage);
|
|
- dequeue_hwpoisoned_huge_page(hpage);
|
|
+ /* overcommit hugetlb page will be freed to buddy */
|
|
+ if (PageHuge(hpage)) {
|
|
+ if (!PageHWPoison(hpage))
|
|
+ atomic_long_add(1 << compound_trans_order(hpage),
|
|
+ &mce_bad_pages);
|
|
+ set_page_hwpoison_huge_page(hpage);
|
|
+ dequeue_hwpoisoned_huge_page(hpage);
|
|
+ } else {
|
|
+ SetPageHWPoison(page);
|
|
+ atomic_long_inc(&mce_bad_pages);
|
|
+ }
|
|
+
|
|
/* keep elevated page count for bad page */
|
|
return ret;
|
|
}
|