On 05/23/2011 03:53 PM, Jan Kiszka wrote:
> The following changes since commit aec30a2543afa18fa7832deee85e187b0faeb1f0:
> 
>   xeno-test: fix reference to @XENO_TEST_DIR@ (2011-05-15 21:20:41 +0200)
> 
> are available in the git repository at:
>   git://git.xenomai.org/xenomai-jki.git for-upstream
> 
> Jan Kiszka (1):
>       native: Fix msendq fastlock leakage
> 
>  include/native/task.h    |    5 +++++
>  ksrc/skins/native/task.c |   13 ++++++-------
>  2 files changed, 11 insertions(+), 7 deletions(-)
> 
> ------8<------
> 
> When a native task terminates without going through rt_task_delete, we
> leaked the fastlock so far. Fix it by moving the release into the delete
> hook. As the ppd is already invalid at that point, we have to save the
> heap address in the task data structure.

I Jan, I once worked on a patch to reverse the ppd cleanup order, in order
to fix bugs of this kind. Here it comes. I do not remember why I did not
commit it, but I guess it was not working well. Could we restart working
from this patch?

>From 038ecf08cd66b3112e0fe277d71d294b8eb83bcc Mon Sep 17 00:00:00 2001
From: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date: Sun, 29 Aug 2010 14:52:08 +0200
Subject: [PATCH] nucleus: reverse ppd cleanup order

---
 ksrc/nucleus/shadow.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index b2d4326..725ae43 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -556,7 +556,7 @@ static unsigned ppd_lookup_inner(xnqueue_t **pq,
        }
        while (holder &&
               (ppd->key.mm < pkey->mm ||
-               (ppd->key.mm == pkey->mm && ppd->key.muxid < pkey->muxid)));
+               (ppd->key.mm == pkey->mm && ppd->key.muxid > pkey->muxid)));
 
        if (ppd->key.mm == pkey->mm && ppd->key.muxid == pkey->muxid) {
                /* found it, return it. */
@@ -566,7 +566,7 @@ static unsigned ppd_lookup_inner(xnqueue_t **pq,
 
        /* not found, return successor for insertion. */
        if (ppd->key.mm < pkey->mm ||
-           (ppd->key.mm == pkey->mm && ppd->key.muxid < pkey->muxid))
+           (ppd->key.mm == pkey->mm && ppd->key.muxid > pkey->muxid))
                *pholder = holder ? link2ppd(holder) : NULL;
        else
                *pholder = ppd;
@@ -589,10 +589,11 @@ static int ppd_insert(xnshadow_ppd_t * holder)
        }
 
        inith(&holder->link);
-       if (next)
+       if (next) {
                insertq(q, &next->link, &holder->link);
-       else
+       } else {
                appendq(q, &holder->link);
+       }
        xnlock_put_irqrestore(&nklock, s);
 
        return 0;
@@ -640,7 +641,7 @@ static inline void ppd_remove_mm(struct mm_struct *mm,
        xnqueue_t *q;
        spl_t s;
 
-       key.muxid = 0;
+       key.muxid = ~0UL;
        key.mm = mm;
        xnlock_get_irqsave(&nklock, s);
        ppd_lookup_inner(&q, &ppd, &key);
-- 
1.7.2.5



-- 
                                                                Gilles.

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to