All of lore.kernel.org
 help / color / mirror / Atom feed
From: Philippe Gerum <rpm@xenomai.org>
To: Philippe Gerum <rpm@xenomai.org>
Cc: xenomai@xenomai.org
Subject: Re: [Xenomai-help] rt_task_delete() question
Date: Fri, 31 Mar 2006 16:20:56 +0200	[thread overview]
Message-ID: <442D3AC8.3080806@domain.hid> (raw)
In-Reply-To: <442D02CD.6080508@domain.hid>

Philippe Gerum wrote:
> Sean McGranaghan wrote:
> 
>> Hello all,
>>
>> I am posting this for a co-worker who is having problems with killing 
>> a real-time task. (He is joining the email list shortly but for now I 
>> will pass responses on to him.) Here is the scenario:
>>
>> 1. A Linux process starts up and detaches from the tty (daemon)
>> 2. The daemon creates a xeno message queue
>> 2. The daemon spawns a xeno task
>> 3. The xeno task on startup binds to the queue rt_queue_bind()
>> 4. The xeno task waits on the queue recv with infinite timeout
>> 5. The daemon process goes to sleep in a join, waiting for the task to 
>> exit
>> 6. Some time later another program starts
>> 7. The other non-realtime program looks up the xeno task name via 
>> rt_task_bind()
>> 8. The other non-realtime program attempts to delete the task via 
>> rt_task_delete()
>>         Failed Attempt #1 - Non-realtime program calls 
>> rt_task_delete() and gets
>>                             a segmentation fault
>>         Failed Attempt #2 - Non-realtime program spawns a realtime 
>> task which
>>                             binds to original task and tries 
>> rt_task_delete().
>>                             Also gets segmentation fault.
>>
> 
> Eeek... 100% reproducible here. Blatant bug. More later. Thanks for 
> reporting.
> 
>> The was attempted one a system running the latest Xenomai 2.1 release.
>>
>> What is the preferred method to start/join threads from a non-realtime 
>> context?
>>
>> Any help is appreciated.
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Xenomai-help mailing list
>> Xenomai-help@domain.hid
>> https://mail.gna.org/listinfo/xenomai-help
> 
> 
>

Fixed in the trunk/ and 2.1 maintenance branches (commits #827 and #828).
The attached patch should apply properly on 2.1.0 with only a few hunks.

Index: src/skins/native/task.c
===================================================================
--- src/skins/native/task.c	(revision 822)
+++ src/skins/native/task.c	(working copy)
@@ -212,7 +212,7 @@
  {
      int err;

-    if (task) {
+    if (task && task->opaque2) {
  	err = pthread_cancel((pthread_t)task->opaque2);
  	if (err)
  	    return -err;
@@ -349,6 +349,9 @@

  int rt_task_join (RT_TASK *task)
  {
+    if (!task->opaque2)
+	return -ESRCH;
+
      return -pthread_join((pthread_t)task->opaque2, NULL);
  }

Index: ksrc/skins/native/syscall.c
===================================================================
--- ksrc/skins/native/syscall.c	(revision 822)
+++ ksrc/skins/native/syscall.c	(working copy)
@@ -207,7 +207,12 @@
      err = __rt_bind_helper(curr,regs,&ph.opaque,XENO_TASK_MAGIC,NULL);

      if (!err)
+	{
+	/* We just don't know the associated user-space pthread
+	   identifier -- clear it to prevent misuse. */
+	ph.opaque2 = 0;
  	__xn_copy_to_user(curr,(void __user *)__xn_reg_arg1(regs),&ph,sizeof(ph));
+	}

      return err;
  }
Index: ksrc/nucleus/shadow.c
===================================================================
--- ksrc/nucleus/shadow.c	(revision 822)
+++ ksrc/nucleus/shadow.c	(working copy)
@@ -327,7 +327,14 @@

  	    case LO_SIGNAL_REQ:

-		send_sig(rq->req[reqnum].arg,p,1);
+		/* Special case: SIGKILL should always be sent to the
+		   entire thread group. */
+
+		if (rq->req[reqnum].arg == SIGKILL)
+		    kill_proc(p->pid,SIGKILL,1);
+		else
+		    send_sig(rq->req[reqnum].arg,p,1);
+
  		break;
  	    }
  	}
@@ -790,7 +797,7 @@
  	xnpod_fatal("xnshadow_unmap() called from invalid context");
  #endif /* CONFIG_XENO_OPT_DEBUG */

-    p = xnthread_archtcb(thread)->user_task;
+    p = xnthread_archtcb(thread)->user_task; /* May be != current */

      magic = xnthread_get_magic(thread);

@@ -819,11 +826,11 @@
      if (p->state != TASK_RUNNING)
  	{
  	/* If the shadow is being unmapped in primary mode or blocked
-	   in secondary mode, the associated Linux task should also
-	   die. In the former case, the zombie Linux side returning to
-	   user-space will be trapped and exited inside the pod's
-	   rescheduling routines. */
-	schedule_linux_call(LO_WAKEUP_REQ,p,0);
+	   in secondary mode, the entire thread group associated with
+	   the mapped task should also die. In the former case, the
+	   zombie Linux side returning to user-space will be trapped
+	   and exited inside the pod's rescheduling routines. */
+	schedule_linux_call(LO_SIGNAL_REQ,p,SIGKILL);
  	return;
  	}

-- 

Philippe.


      reply	other threads:[~2006-03-31 14:20 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-03-30 17:48 [Xenomai-help] rt_task_delete() question Sean McGranaghan
2006-03-30 20:42 ` Jan Kiszka
2006-03-30 21:05   ` Philippe Gerum
2006-03-31 12:12     ` Sean McGranaghan
2006-03-31 10:22 ` Philippe Gerum
2006-03-31 14:20   ` Philippe Gerum [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=442D3AC8.3080806@domain.hid \
    --to=rpm@xenomai.org \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.