Skip to content

Commit 9805a68

Browse files
committed
Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Thomas Gleixner: "A small set of fixes for x86: - Make the tsc=reliable/nowatchdog command line parameter work again. It was broken with the introduction of the early TSC clocksource. - Prevent the evaluation of exception stacks before they are set up. This causes a crash in dumpstack because the stack walk termination gets screwed up. - Prevent a NULL pointer dereference in the rescource control file system. - Avoid bogus warnings about APIC id mismatch related to the LDR which can happen when the LDR is not in use and therefore not initialized. Only evaluate that when the APIC is in logical destination mode" * 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/tsc: Respect tsc command line paraemeter for clocksource_tsc_early x86/dumpstack/64: Don't evaluate exception stacks before setup x86/apic/32: Avoid bogus LDR warnings x86/resctrl: Prevent NULL pointer dereference when reading mondata
2 parents 621084c + 63ec58b commit 9805a68

File tree

4 files changed

+29
-13
lines changed

4 files changed

+29
-13
lines changed

arch/x86/kernel/apic/apic.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,9 +1586,6 @@ static void setup_local_APIC(void)
15861586
{
15871587
int cpu = smp_processor_id();
15881588
unsigned int value;
1589-
#ifdef CONFIG_X86_32
1590-
int logical_apicid, ldr_apicid;
1591-
#endif
15921589

15931590
if (disable_apic) {
15941591
disable_ioapic_support();
@@ -1626,16 +1623,21 @@ static void setup_local_APIC(void)
16261623
apic->init_apic_ldr();
16271624

16281625
#ifdef CONFIG_X86_32
1629-
/*
1630-
* APIC LDR is initialized. If logical_apicid mapping was
1631-
* initialized during get_smp_config(), make sure it matches the
1632-
* actual value.
1633-
*/
1634-
logical_apicid = early_per_cpu(x86_cpu_to_logical_apicid, cpu);
1635-
ldr_apicid = GET_APIC_LOGICAL_ID(apic_read(APIC_LDR));
1636-
WARN_ON(logical_apicid != BAD_APICID && logical_apicid != ldr_apicid);
1637-
/* always use the value from LDR */
1638-
early_per_cpu(x86_cpu_to_logical_apicid, cpu) = ldr_apicid;
1626+
if (apic->dest_logical) {
1627+
int logical_apicid, ldr_apicid;
1628+
1629+
/*
1630+
* APIC LDR is initialized. If logical_apicid mapping was
1631+
* initialized during get_smp_config(), make sure it matches
1632+
* the actual value.
1633+
*/
1634+
logical_apicid = early_per_cpu(x86_cpu_to_logical_apicid, cpu);
1635+
ldr_apicid = GET_APIC_LOGICAL_ID(apic_read(APIC_LDR));
1636+
if (logical_apicid != BAD_APICID)
1637+
WARN_ON(logical_apicid != ldr_apicid);
1638+
/* Always use the value from LDR. */
1639+
early_per_cpu(x86_cpu_to_logical_apicid, cpu) = ldr_apicid;
1640+
}
16391641
#endif
16401642

16411643
/*

arch/x86/kernel/cpu/resctrl/ctrlmondata.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,10 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
522522
int ret = 0;
523523

524524
rdtgrp = rdtgroup_kn_lock_live(of->kn);
525+
if (!rdtgrp) {
526+
ret = -ENOENT;
527+
goto out;
528+
}
525529

526530
md.priv = of->kn->priv;
527531
resid = md.u.rid;

arch/x86/kernel/dumpstack_64.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@ static bool in_exception_stack(unsigned long *stack, struct stack_info *info)
9494
BUILD_BUG_ON(N_EXCEPTION_STACKS != 6);
9595

9696
begin = (unsigned long)__this_cpu_read(cea_exception_stacks);
97+
/*
98+
* Handle the case where stack trace is collected _before_
99+
* cea_exception_stacks had been initialized.
100+
*/
101+
if (!begin)
102+
return false;
103+
97104
end = begin + sizeof(struct cea_exception_stacks);
98105
/* Bail if @stack is outside the exception stack area. */
99106
if (stk < begin || stk >= end)

arch/x86/kernel/tsc.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,6 +1505,9 @@ void __init tsc_init(void)
15051505
return;
15061506
}
15071507

1508+
if (tsc_clocksource_reliable || no_tsc_watchdog)
1509+
clocksource_tsc_early.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
1510+
15081511
clocksource_register_khz(&clocksource_tsc_early, tsc_khz);
15091512
detect_art();
15101513
}

0 commit comments

Comments
 (0)