lkml.org 
[lkml]   [2000]   [Oct]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [patch] APIC, NMI watchdog support on UP systems
On Wed, 4 Oct 2000, Ingo Molnar wrote:

>the latest UP-APIC patch against 2.4.0-test9 (upapic-2.4.0-test9-F5), can
>be downloaded from:
>
>http://www.kernel.org/pub/linux/kernel/people/mingo/apic-patches/
>
>this one should work on all systems - let me know how it behaves, reports,
>suggestions welcome. If any change didnt make it into this patch then
>please resubmit, there were major changes.
>...
> - reworked the APIC-enabling code and boot order along the suggestion of
> Mikael Pettersson, APICs should now be enabled early enough on all
> systems. This should also fix the boot problems seen by Prasanna
> Narayana. (me)

Sorry, but this still doesn't work. I tested -F5 and -F8 and they both
hang at "Calibrating delay loop". Same problem as before: the local APIC's
LVT0 and LVT1 entries hadn't yet been reprogrammed to ExtINT and NMI,
respectively, so no interrupts could be delivered to the CPU core.

I did the following to make -F8 work on my UP Pentium III machine:
* Moved the low-level APIC enabling code out of APIC_init_uniprocessor
to a separate function APIC_enable_uniprocessor (just a wrapper
around setup_local_APIC).
* In init_apic_mappings() I call APIC_enable_uniprocessor immediately
after it has been mapped; without this call, the kernel won't get any
interrupts.
* Moved setup_apic_nmi_watchdog from setup_local_APIC to
APIC_init_uniprocessor; this is because setup_apic_nmi_watchdog needs
cpu_khz, but cpu_khz hasn't been computed yet when my patch calls
setup_local_APIC. I don't know how this will affect SMP systems.
(side note: why not just make setup_apic_nmi_watchdog an __initcall?)

/Mikael

--- linux-2.4.0-test9-upapic-F8/arch/i386/kernel/apic.c.~1~ Thu Oct 5 17:12:13 2000
+++ linux-2.4.0-test9-upapic-F8/arch/i386/kernel/apic.c Thu Oct 5 20:45:12 2000
@@ -32,6 +32,8 @@
int prof_old_multiplier[NR_CPUS] = { 1, };
int prof_counter[NR_CPUS] = { 1, };

+static void APIC_enable_uniprocessor(void);
+
int get_maxlvt(void)
{
unsigned int v, ver, maxlvt;
@@ -315,9 +317,6 @@
* Must be "all ones" explicitly for 82489DX.
*/
apic_write_around(APIC_DFR, 0xffffffff);
-
- if (nmi_watchdog == NMI_LOCAL_APIC)
- setup_apic_nmi_watchdog();
}

/*
@@ -398,6 +397,8 @@
set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
Dprintk("mapped APIC to %08lx (%08lx)\n", APIC_BASE, apic_phys);

+ APIC_enable_uniprocessor();
+
/*
* Fetch the APIC ID of the BSP in case we have a
* default configuration (or the MP table is broken).
@@ -826,10 +827,10 @@
}

/*
- * This initializes the IO-APIC and APIC hardware if this is
- * a UP kernel.
+ * Enable the BSP's local APIC.
+ * Note: interrupts are not yet enabled and cpu_khz is not yet known.
*/
-void __init APIC_init_uniprocessor (void)
+static void __init APIC_enable_uniprocessor (void)
{
if (!cpu_has_apic)
return;
@@ -840,9 +841,21 @@
apic_write_around(APIC_ID, 0);

setup_local_APIC();
+}

- if (nmi_watchdog == NMI_LOCAL_APIC)
+/*
+ * This initializes the IO-APIC and APIC hardware if this is
+ * a UP kernel.
+ */
+void __init APIC_init_uniprocessor (void)
+{
+ if (!cpu_has_apic)
+ return;
+
+ if (nmi_watchdog == NMI_LOCAL_APIC) {
+ setup_apic_nmi_watchdog();
check_nmi_watchdog();
+ }
#ifdef CONFIG_X86_IO_APIC
if (smp_found_config)
setup_IO_APIC();
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 12:39    [W:0.020 / U:4.260 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site