All of lore.kernel.org
 help / color / mirror / Atom feed
* [Adeos-main] [RFC][PATCH] Rework async printk conditions
@ 2008-10-01 12:51 Jan Kiszka
  2008-10-19 10:46 ` Philippe Gerum
  0 siblings, 1 reply; 2+ messages in thread
From: Jan Kiszka @ 2008-10-01 12:51 UTC (permalink / raw)
  To: Philippe Gerum; +Cc: adeos-main

Some ad-hoc instrumentation of Xenomai code running over the root domain
but with the head domain stalled (nklock held) triggered the new
topmost-stalled warning for me.

So I reworked the condition for doing async (ipipe-buffered) printk as
follows:
 no oops in progress AND
 domain did not request sync printk AND
 (domain != root OR
   (domain == root AND some higher domain stalled))

Makes sense?

Jan

---
 kernel/printk.c |   24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

Index: b/kernel/printk.c
===================================================================
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -641,17 +641,33 @@ void __ipipe_flush_printk (unsigned virq
 
 asmlinkage int printk(const char *fmt, ...)
 {
-  	int r, fbytes, oldcount, cs = -1;
-    	unsigned long flags;
+	int r, fbytes, oldcount;
+	int sprintk = 1;
+	int cs = -1;
+	unsigned long flags;
 	va_list args;
 
 	va_start(args, fmt);
 
-	if (test_bit(IPIPE_SPRINTK_FLAG,&ipipe_current_domain->flags) ||
+	if (test_bit(IPIPE_SPRINTK_FLAG, &ipipe_current_domain->flags) ||
 	    oops_in_progress)
 		cs = ipipe_disable_context_check(ipipe_processor_id());
+	else if (ipipe_current_domain == ipipe_root_domain) {
+		struct ipipe_domain *dom;
 
-	if (ipipe_current_domain == ipipe_root_domain || cs != -1) {
+		local_irq_save_hw(flags);
+		list_for_each_entry(dom, &__ipipe_pipeline, p_link) {
+			if (dom == ipipe_root_domain)
+				break;
+			if (test_bit(IPIPE_STALL_FLAG,
+				     &ipipe_cpudom_var(dom, status)))
+				sprintk = 0;
+		}
+		local_irq_restore_hw(flags);
+	} else
+		sprintk = 0;
+
+	if (sprintk) {
 		r = vprintk(fmt, args);
 		if (cs != -1)
 			ipipe_restore_context_check(ipipe_processor_id(), cs);


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Adeos-main] [RFC][PATCH] Rework async printk conditions
  2008-10-01 12:51 [Adeos-main] [RFC][PATCH] Rework async printk conditions Jan Kiszka
@ 2008-10-19 10:46 ` Philippe Gerum
  0 siblings, 0 replies; 2+ messages in thread
From: Philippe Gerum @ 2008-10-19 10:46 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: adeos-main

Jan Kiszka wrote:
> Some ad-hoc instrumentation of Xenomai code running over the root domain
> but with the head domain stalled (nklock held) triggered the new
> topmost-stalled warning for me.
> 
> So I reworked the condition for doing async (ipipe-buffered) printk as
> follows:
>  no oops in progress AND
>  domain did not request sync printk AND
>  (domain != root OR
>    (domain == root AND some higher domain stalled))
> 
> Makes sense?
>

Yes it does. Merged, thanks.

> Jan
> 
> ---
>  kernel/printk.c |   24 ++++++++++++++++++++----
>  1 file changed, 20 insertions(+), 4 deletions(-)
> 
> Index: b/kernel/printk.c
> ===================================================================
> --- a/kernel/printk.c
> +++ b/kernel/printk.c
> @@ -641,17 +641,33 @@ void __ipipe_flush_printk (unsigned virq
>  
>  asmlinkage int printk(const char *fmt, ...)
>  {
> -  	int r, fbytes, oldcount, cs = -1;
> -    	unsigned long flags;
> +	int r, fbytes, oldcount;
> +	int sprintk = 1;
> +	int cs = -1;
> +	unsigned long flags;
>  	va_list args;
>  
>  	va_start(args, fmt);
>  
> -	if (test_bit(IPIPE_SPRINTK_FLAG,&ipipe_current_domain->flags) ||
> +	if (test_bit(IPIPE_SPRINTK_FLAG, &ipipe_current_domain->flags) ||
>  	    oops_in_progress)
>  		cs = ipipe_disable_context_check(ipipe_processor_id());
> +	else if (ipipe_current_domain == ipipe_root_domain) {
> +		struct ipipe_domain *dom;
>  
> -	if (ipipe_current_domain == ipipe_root_domain || cs != -1) {
> +		local_irq_save_hw(flags);
> +		list_for_each_entry(dom, &__ipipe_pipeline, p_link) {
> +			if (dom == ipipe_root_domain)
> +				break;
> +			if (test_bit(IPIPE_STALL_FLAG,
> +				     &ipipe_cpudom_var(dom, status)))
> +				sprintk = 0;
> +		}
> +		local_irq_restore_hw(flags);
> +	} else
> +		sprintk = 0;
> +
> +	if (sprintk) {
>  		r = vprintk(fmt, args);
>  		if (cs != -1)
>  			ipipe_restore_context_check(ipipe_processor_id(), cs);
> 
> _______________________________________________
> Adeos-main mailing list
> Adeos-main@domain.hid
> https://mail.gna.org/listinfo/adeos-main
> 


-- 
Philippe.


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2008-10-19 10:46 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-01 12:51 [Adeos-main] [RFC][PATCH] Rework async printk conditions Jan Kiszka
2008-10-19 10:46 ` Philippe Gerum

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.