I'm really not willing to apply this kludge... 
On Thu, 6 Dec 2001, Andrew Morton wrote:
> j-nomura@ce.jp.nec.com wrote:
> > 
> > Hi,
> > excuse me for not prompt response. I've been off-line for 2 days.
> > 
> > > > The reason I put it in release_console_sem() is that release_console_sem()
> > > > can be called from other functions than printk(), e.g. console_unblank().
> > > > I agree with you that it is clearer but I think it is not sufficient.
> > >
> > > I really doubt if any of those paths could be called before
> > > even the MMU is set up.
> > 
> 
> Marcelo,
> 
> after a fairly lengthy off-list discussion, it turns out that
> special-casing printk is probably the best way to proceed
> to fix this one.
> 
> The problem is that the boot processor sets up the console drivers,
> and is able to call them via printk(), but the application processors
> at that time are not able to call printk() because the console device
> driver mappings are not set up.  Undoing this inside the ia64 boot code is
> complex and fragile.   Possibly the problem exists on other platforms
> but hasn't been discovered yet.
> 
> So the patch defines an architecture-specific macro `arch_consoles_callable()'
> which, if not defined, defaults to `1', so the impact to other platforms
> (and to uniprocessor ia64) is zero.
> 
> 
> 
> --- linux-2.4.17-pre4/include/asm-ia64/system.h	Thu Nov 22 23:02:59 2001
> +++ linux-akpm/include/asm-ia64/system.h	Wed Dec  5 23:09:15 2001
> @@ -405,6 +405,10 @@ extern void ia64_load_extra (struct task
>  	ia64_psr(ia64_task_regs(prev))->dfh = 1;				\
>  	__switch_to(prev,next,last);						\
>    } while (0)
> +
> +/* Return true if this CPU can call the console drivers in printk() */
> +#define arch_consoles_callable() (cpu_online_map & (1UL << smp_processor_id()))
> +
>  #else
>  # define switch_to(prev,next,last) do {						\
>  	ia64_psr(ia64_task_regs(next))->dfh = (ia64_get_fpu_owner() != (next));	\
> --- linux-2.4.17-pre4/kernel/printk.c	Thu Nov 22 23:02:59 2001
> +++ linux-akpm/kernel/printk.c	Wed Dec  5 23:03:54 2001
> @@ -38,6 +38,10 @@
>  
>  #define LOG_BUF_MASK	(LOG_BUF_LEN-1)
>  
> +#ifndef arch_consoles_callable
> +#define arch_consoles_callable() (1)
> +#endif
> +
>  /* printk's without a loglevel use this.. */
>  #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
>  
> @@ -438,6 +442,14 @@ asmlinkage int printk(const char *fmt, .
>  			log_level_unknown = 1;
>  	}
>  
> +	if (!arch_consoles_callable()) {
> +		/*
> +		 * On some architectures, the consoles are not usable
> +		 * on secondary CPUs early in the boot process.
> +		 */
> +		spin_unlock_irqrestore(&logbuf_lock, flags);
> +		goto out;
> +	}
>  	if (!down_trylock(&console_sem)) {
>  		/*
>  		 * We own the drivers.  We can drop the spinlock and let
> @@ -454,6 +466,7 @@ asmlinkage int printk(const char *fmt, .
>  		 */
>  		spin_unlock_irqrestore(&logbuf_lock, flags);
>  	}
> +out:
>  	return printed_len;
>  }
>  EXPORT_SYMBOL(printk);
> 
-
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/