svn commit: r233961 - head/sys/x86/x86

Attilio Rao attilio at freebsd.org
Mon Apr 9 17:59:17 UTC 2012


Il 09 aprile 2012 18:14, John Baldwin <jhb at freebsd.org> ha scritto:
> On Monday, April 09, 2012 12:58:07 pm Attilio Rao wrote:
>> Il 09 aprile 2012 17:34, John Baldwin <jhb at freebsd.org> ha scritto:
>> > On Monday, April 09, 2012 11:45:11 am Jaakko Heinonen wrote:
>> >>
>> >> Hi,
>> >>
>> >> On 2012-04-06, Justin T. Gibbs wrote:
>> >> >   Fix interrupt load balancing regression, introduced in revision
>> >> >   222813, that left all un-pinned interrupts assigned to CPU 0.
>> >> >
>> >> >   sys/x86/x86/intr_machdep.c:
>> >> >     In intr_shuffle_irqs(), remove CPU_SETOF() call that initialized
>> >> >     the "intr_cpus" cpuset to only contain CPU0.
>> >> >
>> >> >     This initialization is too late and nullifies the results of calls
>> >> >     the intr_add_cpu() that occur much earlier in the boot process.
>> >> >     Since "intr_cpus" is statically initialized to the empty set, and
>> >> >     all processors, including the BSP, already add themselves to
>> >> >     "intr_cpus" no special initialization for the BSP is necessary.
>> >>
>> >> My Pentium 4 system hangs on boot after this commit. These are the last
>> >> lines from a verbose boot:
>> >>
>> >> SMP: AP CPU #1 Launched!
>> >> cpu1 AP:
>> >>      ID: 0x01000000   VER: 0x00050014 LDR: 0x00000000 DFR: 0xffffffff
>> >>   lint0: 0x00010700 lint1: 0x00000400 TPR: 0x00000000 SVR: 0x000001ff
>> >>   timer: 0x000100ef therm: 0x00010000 err: 0x000000f0 pmc: 0x00010400
>> >>
>> >> The system boots with r233960.
>> >>
>> >> Some information:
>> >>
>> >> CPU: Intel(R) Pentium(R) 4 CPU 2.60GHz (2605.96-MHz 686-class CPU)
>> >>   Origin = "GenuineIntel"  Id = 0xf29  Family = f  Model = 2  Stepping =
>> >> 9
>> >>
>> > Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
>> >>   Features2=0x4400<CNXT-ID,xTPR>
>> >> real memory  = 2147483648 (2048 MB)
>> >> avail memory = 2085228544 (1988 MB)
>> >> Event timer "LAPIC" quality 400
>> >> ACPI APIC Table: <A M I  OEMAPIC >
>> >> FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
>> >> FreeBSD/SMP: 1 package(s) x 1 core(s) x 2 HTT threads
>> >>  cpu0 (BSP): APIC ID:  0
>> >>  cpu1 (AP/HT): APIC ID:  1
>> >
>> > I suspect in your case intr_add_cpu() is never called.  I think Attilio is not
>> > correct in that it is not called for the BSP.
>> >
>> > Yes, it is not called for the BSP in set_interrupt_apic_ids().  This used to
>> > work because bit 0 was assigned statically.  Also, in a UP machine
>> > set_interrupt_apic_ids() is not called at all.
>>
>> But why there is a front-end check for the BSP in set_interrupt_apic_ids()?
>>
>> Anyway, I think a better fix would be like the attached patch.
>
> This would be fine.  What I would really prefer is to not need the sysinit at
> all and be able to do something like the original pre-cpuset code:
>
> static cpuset_t intr_cpus = CPU_INITIAILIZER(0);

This is more difficult to do because it would require static array
initializations and it would pollute too much the code with compile
time, MAXCPU-dependant details.

> Also, with the cpuset variant, I think we could remove the special case check
> for the BSP from set_apic_interrupt_ids() as it doesn't hurt to set it
> multiple times.   IIRC, the pre-cpuset code kept a separate count which is
> why that would have been harmful.

I'm not sure I follow, a separate count for what?
So do you consider the following patch as a real commit candidate?

Thanks,
Attilio

Index: sys/i386/i386/mp_machdep.c
===================================================================
--- sys/i386/i386/mp_machdep.c  (revisione 234064)
+++ sys/i386/i386/mp_machdep.c  (copia locale)
@@ -819,8 +819,6 @@ init_secondary(void)
  * We tell the I/O APIC code about all the CPUs we want to receive
  * interrupts.  If we don't want certain CPUs to receive IRQs we
  * can simply not tell the I/O APIC code about them in this function.
- * We also do not tell it about the BSP since it tells itself about
- * the BSP internally to work with UP kernels and on UP machines.
  */
 static void
 set_interrupt_apic_ids(void)
@@ -831,8 +829,6 @@ set_interrupt_apic_ids(void)
                apic_id = cpu_apic_ids[i];
                if (apic_id == -1)
                        continue;
-               if (cpu_info[apic_id].cpu_bsp)
-                       continue;
                if (cpu_info[apic_id].cpu_disabled)
                        continue;

Index: sys/i386/i386/machdep.c
===================================================================
--- sys/i386/i386/machdep.c     (revisione 234064)
+++ sys/i386/i386/machdep.c     (copia locale)
@@ -336,6 +336,11 @@ cpu_startup(dummy)
 #ifndef XEN
        cpu_setregs();
 #endif
+
+       /*
+        * Add BSP interrupt bitmask.
+        */
+       intr_add_cpu(0);
 }

 /*
Index: sys/amd64/amd64/mp_machdep.c
===================================================================
--- sys/amd64/amd64/mp_machdep.c        (revisione 234064)
+++ sys/amd64/amd64/mp_machdep.c        (copia locale)
@@ -785,8 +785,6 @@ init_secondary(void)
  * We tell the I/O APIC code about all the CPUs we want to receive
  * interrupts.  If we don't want certain CPUs to receive IRQs we
  * can simply not tell the I/O APIC code about them in this function.
- * We also do not tell it about the BSP since it tells itself about
- * the BSP internally to work with UP kernels and on UP machines.
  */
 static void
 set_interrupt_apic_ids(void)
@@ -797,8 +795,6 @@ set_interrupt_apic_ids(void)
                apic_id = cpu_apic_ids[i];
                if (apic_id == -1)
                        continue;
-               if (cpu_info[apic_id].cpu_bsp)
-                       continue;
                if (cpu_info[apic_id].cpu_disabled)
                        continue;

Index: sys/amd64/amd64/machdep.c
===================================================================
--- sys/amd64/amd64/machdep.c   (revisione 234064)
+++ sys/amd64/amd64/machdep.c   (copia locale)
@@ -295,6 +295,11 @@ cpu_startup(dummy)
        vm_pager_bufferinit();

        cpu_setregs();
+
+       /*
+        * Add BSP interrupt bitmask.
+        */
+       intr_add_cpu(0);
 }

 /*


More information about the svn-src-all mailing list