lkml.org 
[lkml]   [2002]   [Dec]   [22]   [last100]   RSS Feed
Views: [more markup]   [less markup]   [headers]   [forward]  
 
Messages in this thread
/
DateSun, 22 Dec 2002 01:58:13 -0800
Fromgeorge anzinger <>
SubjectRe: [PATCH]Timer list init is done AFTER use
Looks ok.  I will give it a spin on Monday.

-g

Andrew Morton wrote:
> 
> george anzinger wrote:
> >
> > ...
> > I am not sure.  The first question is when does the online
> > bit get set for cpu 0.  The next is that it does inhibit a
> > rather large block of printks.  Is this ok?
> >
> 
> The boot cpu is set online extremely late.  Strangely late.  Why
> is this?
> 
> How about something like the below?  We mark the boot cpu
> online in generic code as soon as it has initialised its per-cpu
> storage (seems appropriate?)
> 
> This will then allow that cpu to actually start calling into console
> drivers, if they have been registered.  If those drivers do a mod_timer()
> (as the vga console does) then that will work OK.
> 
> Secondary CPUs also are not marked online until their per-cpu storage is
> initialised, and their notifiers have been called.
> 
> If a non-online cpu calls printk, its output will be buffered.  It will
> be displayed by the next call to printk by an online CPU.
> 
> (The patch needs set_cpu_online()/set_cpu_possible() implementations
> done for the other architectures)
> 
>  arch/i386/kernel/smpboot.c |    5 -----
>  include/asm-i386/smp.h     |   29 +++++++++++++++++++++++------
>  include/linux/smp.h        |    7 ++++++-
>  init/main.c                |    8 ++++++++
>  kernel/printk.c            |    6 +++++-
>  5 files changed, 42 insertions(+), 13 deletions(-)
> 
> --- 25/kernel/printk.c~ga       Sat Dec 21 23:27:08 2002
> +++ 25-akpm/kernel/printk.c     Sat Dec 21 23:27:08 2002
> @@ -43,7 +43,11 @@
>  #define LOG_BUF_MASK   (LOG_BUF_LEN-1)
> 
>  #ifndef arch_consoles_callable
> -#define arch_consoles_callable() (1)
> +/*
> + * Some console drivers may assume that per-cpu resources have been allocated.
> + * So don't allow them to be called by this CPU until it is officially up.
> + */
> +#define arch_consoles_callable() cpu_online(smp_processor_id())
>  #endif
> 
>  /* printk's without a loglevel use this.. */
> --- 25/init/main.c~ga   Sat Dec 21 23:48:03 2002
> +++ 25-akpm/init/main.c Sat Dec 21 23:55:00 2002
> @@ -361,6 +361,14 @@ asmlinkage void __init start_kernel(void
>         printk(linux_banner);
>         setup_arch(&command_line);
>         setup_per_cpu_areas();
> +
> +       /*
> +        * Once the boot CPU's per-cpu memory is set up it may be considered
> +        * online.  This is mainly to turn on printk output.
> +        */
> +       set_cpu_online(smp_processor_id());
> +       set_cpu_possible(smp_processor_id());
> +
>         build_all_zonelists();
>         page_alloc_init();
>         printk("Kernel command line: %s\n", saved_command_line);
> --- 25/include/asm-i386/smp.h~ga        Sat Dec 21 23:49:43 2002
> +++ 25-akpm/include/asm-i386/smp.h      Sat Dec 21 23:54:16 2002
> @@ -80,15 +80,32 @@ extern volatile int logical_apicid_to_cp
> 
>  extern volatile unsigned long cpu_callout_map;
> 
> -#define cpu_possible(cpu) (cpu_callout_map & (1<<(cpu)))
> -#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
> +static inline int cpu_possible(int cpu)
> +{
> +       return cpu_callout_map & (1 << cpu);
> +}
> +
> +static inline void set_cpu_possible(int cpu)
> +{
> +       cpu_callout_map |= (1 << cpu);
> +}
> +
> +static inline int cpu_online(int cpu)
> +{
> +       return cpu_online_map & (1 << cpu);
> +}
> +
> +static inline void set_cpu_online(int cpu)
> +{
> +       cpu_online_map |= (1 << cpu);
> +}
> 
> -extern inline unsigned int num_online_cpus(void)
> +static inline unsigned int num_online_cpus(void)
>  {
>         return hweight32(cpu_online_map);
>  }
> 
> -extern inline int any_online_cpu(unsigned int mask)
> +static inline int any_online_cpu(unsigned int mask)
>  {
>         if (mask & cpu_online_map)
>                 return __ffs(mask & cpu_online_map);
> @@ -96,13 +113,13 @@ extern inline int any_online_cpu(unsigne
>         return -1;
>  }
> 
> -static __inline int hard_smp_processor_id(void)
> +static inline int hard_smp_processor_id(void)
>  {
>         /* we don't want to mark this access volatile - bad code generation */
>         return GET_APIC_ID(*(unsigned long *)(APIC_BASE+APIC_ID));
>  }
> 
> -static __inline int logical_smp_processor_id(void)
> +static inline int logical_smp_processor_id(void)
>  {
>         /* we don't want to mark this access volatile - bad code generation */
>         return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR));
> --- 25/arch/i386/kernel/smpboot.c~ga    Sat Dec 21 23:52:51 2002
> +++ 25-akpm/arch/i386/kernel/smpboot.c  Sat Dec 21 23:54:43 2002
> @@ -992,11 +992,6 @@ static void __init smp_boot_cpus(unsigne
>         printk("CPU%d: ", 0);
>         print_cpu_info(&cpu_data[0]);
> 
> -       /*
> -        * We have the boot CPU online for sure.
> -        */
> -       set_bit(0, &cpu_online_map);
> -       set_bit(0, &cpu_callout_map);
>         boot_cpu_logical_apicid = logical_smp_processor_id();
>         map_cpu_to_boot_apicid(0, boot_cpu_apicid);
> 
> --- 25/include/linux/smp.h~ga   Sun Dec 22 00:29:05 2002
> +++ 25-akpm/include/linux/smp.h Sun Dec 22 00:30:15 2002
> @@ -94,7 +94,12 @@ static inline void smp_send_reschedule_a
>  #define cpu_online(cpu)                                ({ BUG_ON((cpu) != 0); 1; })
>  #define num_online_cpus()                      1
>  #define num_booting_cpus()                     1
> -#define cpu_possible(cpu)                              ({ BUG_ON((cpu) != 0); 1; })
> +#define cpu_possible(cpu)                      ({ BUG_ON((cpu) != 0); 1; })
> +static inline void set_cpu_online(int cpu)
> +{}
> +static inline void set_cpu_possible(int cpu)
> +{}
> +
> 
>  struct notifier_block;
> 
> 
> _
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

-- 
George Anzinger   george@mvista.com
High-res-timers: 
http://sourceforge.net/projects/high-res-timers/
Preemption patch:
http://www.kernel.org/pub/linux/kernel/people/rml
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 11:31    [W:0.681 / U:0.110 seconds]
©2003-2008 Jasper Spaans