[Xenomai-git] Gilles Chanteperdrix : nucleus: print warning when destroying a heap with allocated data

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: 002c925280ed799095c13eb041e82c4a113bfc04
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=002c925280ed799095c13eb041e82c4a113bfc04

Author: Gilles Chanteperdrix 
Date:   Sun Jun 19 17:20:10 2011 +0200

nucleus: print warning when destroying a heap with allocated data

---

 ksrc/nucleus/heap.c |5 +
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/ksrc/nucleus/heap.c b/ksrc/nucleus/heap.c
index a26e4fe..6d3dee5 100644
--- a/ksrc/nucleus/heap.c
+++ b/ksrc/nucleus/heap.c
@@ -1395,6 +1395,11 @@ void xnheap_destroy_mapped(xnheap_t *heap,
 */
XENO_ASSERT(NUCLEUS, mapaddr == NULL || release, /* nop */);
 
+   if (XENO_DEBUG(NUCLEUS) && heap->u_bytes != 0)
+   printk(KERN_ERROR "xnheap: destroying shared heap '%s' "
+  "with %u bytes still in use.\n",
+  heap->label, heap->u_bytes);
+
xnlock_get_irqsave(&nklock, s);
removeq(&heapq, &heap->stat_link);
xnvfile_touch_tag(&vfile_tag);


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : nucleus: move mayday addr to sys_ppd only

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: 97ca09e5e6c50e5954fecd4f3be08e9f3bd532fc
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=97ca09e5e6c50e5954fecd4f3be08e9f3bd532fc

Author: Gilles Chanteperdrix 
Date:   Sun Jun 19 13:30:24 2011 +0200

nucleus: move mayday addr to sys_ppd only

---

 include/nucleus/ppd.h |3 ---
 include/nucleus/sys_ppd.h |4 +++-
 ksrc/nucleus/shadow.c |   34 +++---
 3 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/include/nucleus/ppd.h b/include/nucleus/ppd.h
index 972b0f2..85971f0 100644
--- a/include/nucleus/ppd.h
+++ b/include/nucleus/ppd.h
@@ -14,9 +14,6 @@ typedef struct xnshadow_ppd_key {
 typedef struct xnshadow_ppd_t {
 xnshadow_ppd_key_t key;
 xnholder_t link;
-#ifdef XNARCH_HAVE_MAYDAY
-unsigned long mayday_addr;
-#endif
 #define link2ppd(ln)   container_of(ln, xnshadow_ppd_t, link)
 } xnshadow_ppd_t;
 
diff --git a/include/nucleus/sys_ppd.h b/include/nucleus/sys_ppd.h
index 8f8cb44..3ae8581 100644
--- a/include/nucleus/sys_ppd.h
+++ b/include/nucleus/sys_ppd.h
@@ -7,7 +7,9 @@
 struct xnsys_ppd {
xnshadow_ppd_t ppd;
xnheap_t sem_heap;
-
+#ifdef XNARCH_HAVE_MAYDAY
+   unsigned long mayday_addr;
+#endif
 #define ppd2sys(addr) container_of(addr, struct xnsys_ppd, ppd)
 };
 
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index f6e0893..e5dd421 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -1632,11 +1632,11 @@ static inline void do_mayday_event(struct pt_regs *regs)
 {
struct xnthread *thread = xnshadow_thread(current);
struct xnarchtcb *tcb = xnthread_archtcb(thread);
-   struct xnshadow_ppd_t *sys_ppd;
+   struct xnsys_ppd *sys_ppd;
 
/* We enter the event handler with hw IRQs off. */
xnlock_get(&nklock);
-   sys_ppd = xnshadow_ppd_get(0);
+   sys_ppd = xnsys_ppd_get(0);
xnlock_put(&nklock);
XENO_BUGON(NUCLEUS, sys_ppd == NULL);
 
@@ -1754,16 +1754,6 @@ static int xnshadow_sys_bind(struct pt_regs *regs)
 
sys_ppd->key.muxid = 0;
sys_ppd->key.mm = current->mm;
-#ifdef XNARCH_HAVE_MAYDAY
-   sys_ppd->mayday_addr = map_mayday_page(current);
-   if (sys_ppd->mayday_addr == 0) {
-   printk(KERN_WARNING
-  "Xenomai: %s[%d] cannot map MAYDAY page\n",
-  current->comm, current->pid);
-   err = -ENOMEM;
-   goto fail_destroy_sys_ppd;
-   }
-#endif /* XNARCH_HAVE_MAYDAY */
 
if (ppd_insert(sys_ppd) == -EBUSY) {
/* In case of concurrent binding (which can not happen with
@@ -2109,12 +2099,26 @@ static void *xnshadow_sys_event(int event, void *data)
err = xnheap_init_mapped(&p->sem_heap,
 CONFIG_XENO_OPT_SEM_HEAPSZ * 1024,
 XNARCH_SHARED_HEAP_FLAGS);
-   if (err) {
+   if (err)
+   goto err_free_host_mem;
+
+   xnheap_set_label(&p->sem_heap,
+"private sem heap [%d]", current->pid);
+
+#ifdef XNARCH_HAVE_MAYDAY
+   p->mayday_addr = map_mayday_page(current);
+   if (p->mayday_addr == 0) {
+   printk(KERN_WARNING
+  "Xenomai: %s[%d] cannot map MAYDAY page\n",
+  current->comm, current->pid);
+   err = -ENOMEM;
+
+ err_free_host_mem:
xnarch_free_host_mem(p, sizeof(*p));
return ERR_PTR(err);
}
-   xnheap_set_label(&p->sem_heap,
-"private sem heap [%d]", current->pid);
+#endif /* XNARCH_HAVE_MAYDAY */
+
xnarch_atomic_inc(&muxtable[0].refcnt);
return &p->ppd;
 


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : nucleus: fix ppd cleanup

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: 6b7f363156e6b2e6deb5d968f99feac0578aa62f
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=6b7f363156e6b2e6deb5d968f99feac0578aa62f

Author: Gilles Chanteperdrix 
Date:   Sun Jun 19 13:19:01 2011 +0200

nucleus: fix ppd cleanup

During ppd cleanup, current->mm is not necessarily the mm of the process
being cleaned up, this prevents xnshadow_ppd_get from being used during
cleanup. Additionally, current->mm is NULL when executing shadow cleanup
hooks during process exit.

This commit uses an adeos ptd in order to store the mm of a shadow. This
ptd is set upon shadow map to avoid the second issue, and temporarily to
the process executing the mm cleanup to avoid the first one.

---

 ksrc/nucleus/shadow.c|   20 ++--
 ksrc/skins/posix/mutex.c |4 
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 679826e..f6e0893 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -65,6 +65,11 @@ int nkthrptd;
 EXPORT_SYMBOL_GPL(nkthrptd);
 int nkerrptd;
 EXPORT_SYMBOL_GPL(nkerrptd);
+int nkmmptd;
+EXPORT_SYMBOL_GPL(nkmmptd);
+
+#define xnshadow_mmptd(t) ((t)->ptd[nkmmptd])
+#define xnshadow_mm(t) ((struct mm_struct *)xnshadow_mmptd(t))
 
 struct xnskin_slot {
struct xnskin_props *props;
@@ -1299,6 +1304,8 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t 
__user *u_completion,
 * friends.
 */
xnshadow_thrptd(current) = thread;
+   xnshadow_mmptd(current) = current->mm;
+
rthal_enable_notifier(current);
 
if (xnthread_base_priority(thread) == 0 &&
@@ -2754,7 +2761,15 @@ static void detach_ppd(xnshadow_ppd_t * ppd)
 
 static inline void do_cleanup_event(struct mm_struct *mm)
 {
+   struct task_struct *p = current;
+   struct mm_struct *old;
+
+   old = xnshadow_mm(p);
+   xnshadow_mmptd(p) = mm;
+
ppd_remove_mm(mm, &detach_ppd);
+
+   xnshadow_mmptd(p) = old;
 }
 
 RTHAL_DECLARE_CLEANUP_EVENT(cleanup_event);
@@ -2920,7 +2935,7 @@ EXPORT_SYMBOL_GPL(xnshadow_unregister_interface);
 xnshadow_ppd_t *xnshadow_ppd_get(unsigned muxid)
 {
if (xnpod_userspace_p())
-   return ppd_lookup(muxid, current->mm);
+   return ppd_lookup(muxid, xnshadow_mm(current) ?: current->mm);
 
return NULL;
 }
@@ -2955,8 +2970,9 @@ int xnshadow_mount(void)
sema_init(&completion_mutex, 1);
nkthrptd = rthal_alloc_ptdkey();
nkerrptd = rthal_alloc_ptdkey();
+   nkmmptd = rthal_alloc_ptdkey();
 
-   if (nkthrptd < 0 || nkerrptd < 0) {
+   if (nkthrptd < 0 || nkerrptd < 0 || nkmmptd < 0) {
printk(KERN_ERR "Xenomai: cannot allocate PTD slots\n");
return -ENOMEM;
}
diff --git a/ksrc/skins/posix/mutex.c b/ksrc/skins/posix/mutex.c
index 6ce75e5..cc86852 100644
--- a/ksrc/skins/posix/mutex.c
+++ b/ksrc/skins/posix/mutex.c
@@ -219,10 +219,6 @@ void pse51_mutex_destroy_internal(pse51_mutex_t *mutex,
xnlock_put_irqrestore(&nklock, s);
 
 #ifdef CONFIG_XENO_FASTSYNCH
-   /* We call xnheap_free even if the mutex is not pshared; when
-  this function is called from pse51_mutexq_cleanup, the
-  sem_heap is destroyed, or not the one to which the fastlock
-  belongs, xnheap will simply return an error. */
xnheap_free(&xnsys_ppd_get(mutex->attr.pshared)->sem_heap,
mutex->synchbase.fastlock);
 #endif /* CONFIG_XENO_FASTSYNCH */


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : nucleus: reverse ppd cleanup order

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: e6d0054a0a6e32578f4d30e8f1ea108fa578
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=e6d0054a0a6e32578f4d30e8f1ea108fa578

Author: Gilles Chanteperdrix 
Date:   Sun Jun 19 11:09:21 2011 +0200

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 9f82fa8..679826e 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -563,7 +563,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. */
@@ -573,7 +573,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;
@@ -596,10 +596,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;
@@ -647,7 +648,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);


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : nucleus: add reference counter to sys_ppd

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: 1f14785539e6add86bc583804f0476c56d1ca7f3
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=1f14785539e6add86bc583804f0476c56d1ca7f3

Author: Gilles Chanteperdrix 
Date:   Thu Jun 23 22:57:59 2011 +0200

nucleus: add reference counter to sys_ppd

This way, if the main thread is shadowed and the last event is its
taskexit event, the ppd are destroyed at this point and not earlier.

---

 include/nucleus/sys_ppd.h |1 +
 ksrc/nucleus/shadow.c |   53 
 2 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/include/nucleus/sys_ppd.h b/include/nucleus/sys_ppd.h
index 3ae8581..665e973 100644
--- a/include/nucleus/sys_ppd.h
+++ b/include/nucleus/sys_ppd.h
@@ -10,6 +10,7 @@ struct xnsys_ppd {
 #ifdef XNARCH_HAVE_MAYDAY
unsigned long mayday_addr;
 #endif
+   xnarch_atomic_t refcnt;
 #define ppd2sys(addr) container_of(addr, struct xnsys_ppd, ppd)
 };
 
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index dcda1e7..08ce462 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -673,6 +673,14 @@ static inline void ppd_remove_mm(struct mm_struct *mm,
xnlock_put_irqrestore(&nklock, s);
 }
 
+static void detach_ppd(xnshadow_ppd_t * ppd)
+{
+   unsigned muxid = xnshadow_ppd_muxid(ppd);
+   muxtable[muxid].props->eventcb(XNSHADOW_CLIENT_DETACH, ppd);
+   if (muxtable[muxid].props->module)
+   module_put(muxtable[muxid].props->module);
+}
+
 struct xnvdso *nkvdso;
 EXPORT_SYMBOL_GPL(nkvdso);
 
@@ -1237,9 +1245,11 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t 
__user *u_completion,
 {
struct xnthread_start_attr attr;
xnarch_cpumask_t affinity;
+   struct xnsys_ppd *sys_ppd;
unsigned int muxid, magic;
unsigned long *u_mode;
xnheap_t *sem_heap;
+   spl_t s;
int ret;
 
if (!xnthread_test_state(thread, XNSHADOW))
@@ -1278,7 +1288,11 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t 
__user *u_completion,
}
}
 
-   sem_heap = &xnsys_ppd_get(0)->sem_heap;
+   xnlock_get_irqsave(&nklock, s);
+   sys_ppd = xnsys_ppd_get(0);
+   xnlock_put_irqrestore(&nklock, s);
+
+   sem_heap = &sys_ppd->sem_heap;
u_mode = xnheap_alloc(sem_heap, sizeof(*u_mode));
if (!u_mode)
return -ENOMEM;
@@ -1317,6 +1331,7 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t 
__user *u_completion,
 */
xnshadow_thrptd(current) = thread;
xnshadow_mmptd(current) = current->mm;
+   xnarch_atomic_inc(&sys_ppd->refcnt);
 
rthal_enable_notifier(current);
 
@@ -1371,6 +1386,7 @@ EXPORT_SYMBOL_GPL(xnshadow_map);
 
 void xnshadow_unmap(xnthread_t *thread)
 {
+   struct xnsys_ppd *sys_ppd;
struct task_struct *p;
 
if (XENO_DEBUG(NUCLEUS) &&
@@ -1382,6 +1398,12 @@ void xnshadow_unmap(xnthread_t *thread)
xnthread_clear_state(thread, XNMAPPED);
rpi_pop(thread);
 
+   sys_ppd = xnsys_ppd_get(0);
+   xnheap_free(&sys_ppd->sem_heap, thread->u_mode);
+   thread->u_mode = NULL;
+
+   xnarch_atomic_dec(&sys_ppd->refcnt);
+
trace_mark(xn_nucleus, shadow_unmap,
   "thread %p thread_name %s pid %d",
   thread, xnthread_name(thread), p ? p->pid : -1);
@@ -1396,9 +1418,6 @@ void xnshadow_unmap(xnthread_t *thread)
 
xnshadow_thrptd(p) = NULL;
 
-   xnheap_free(&xnsys_ppd_get(0)->sem_heap, thread->u_mode);
-   thread->u_mode = NULL;
-
schedule_linux_call(LO_UNMAP_REQ, p, xnthread_get_magic(thread));
 }
 EXPORT_SYMBOL_GPL(xnshadow_unmap);
@@ -2119,14 +2138,14 @@ static void *xnshadow_sys_event(int event, void *data)
return ERR_PTR(err);
}
 #endif /* XNARCH_HAVE_MAYDAY */
-
+   xnarch_atomic_set(&p->refcnt, 1);
xnarch_atomic_inc(&muxtable[0].refcnt);
return &p->ppd;
 
case XNSHADOW_CLIENT_DETACH:
+   printk("sys detach !\n");
p = ppd2sys(data);
xnheap_destroy_mapped(&p->sem_heap, post_ppd_release, NULL);
-   xnarch_atomic_dec(&muxtable[0].refcnt);
 
return NULL;
}
@@ -2474,6 +2493,7 @@ RTHAL_DECLARE_EVENT(losyscall_event);
 static inline void do_taskexit_event(struct task_struct *p)
 {
xnthread_t *thread = xnshadow_thread(p); /* p == current */
+   struct xnsys_ppd *sys_ppd;
unsigned magic;
spl_t s;
 
@@ -2494,9 +2514,13 @@ static inline void do_taskexit_event(struct task_struct 
*p)
/* xnpod_delete_thread() -> hook -> xnshadow_unmap(). */
xnsched_set_resched(thread->sched);
xnpod_delete_thread(thread);
+   sys_ppd = xnsys_ppd_get(0);
xnlock_put_irqrestore(&nklock, s);
xnpod_schedule();
 
+   if (!xnarch_atomic_get(&sys_ppd->refcnt))
+   ppd_remove_mm(xns

[Xenomai-git] Gilles Chanteperdrix : nucleus: print warning when destroying a heap with allocated data

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: 2027928d8722c411a210c5b641e6f4964e0fbba7
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=2027928d8722c411a210c5b641e6f4964e0fbba7

Author: Gilles Chanteperdrix 
Date:   Sun Jun 19 17:20:10 2011 +0200

nucleus: print warning when destroying a heap with allocated data

---

 ksrc/nucleus/heap.c |5 +
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/ksrc/nucleus/heap.c b/ksrc/nucleus/heap.c
index 0ab5114..3148ba3 100644
--- a/ksrc/nucleus/heap.c
+++ b/ksrc/nucleus/heap.c
@@ -1395,6 +1395,11 @@ void xnheap_destroy_mapped(xnheap_t *heap,
 */
XENO_ASSERT(NUCLEUS, mapaddr == NULL || release, /* nop */);
 
+   if (XENO_DEBUG(NUCLEUS) && heap->u_bytes != 0)
+   printk(KERN_ERROR "xnheap: destroying shared heap '%s' "
+  "with %lu bytes still in use.\n",
+  heap->label, heap->ubytes);
+
xnlock_get_irqsave(&nklock, s);
removeq(&heapq, &heap->stat_link);
xnvfile_touch_tag(&vfile_tag);


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : native: move mps fastlock deallocation to task deletion hook

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: bada9086709d7bfe8332acd8358d51245df3ea3f
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=bada9086709d7bfe8332acd8358d51245df3ea3f

Author: Gilles Chanteperdrix 
Date:   Sun Jun 19 14:50:56 2011 +0200

native: move mps fastlock deallocation to task deletion hook

---

 ksrc/skins/native/task.c |   10 +-
 1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/ksrc/skins/native/task.c b/ksrc/skins/native/task.c
index 874ed5b..da4e626 100644
--- a/ksrc/skins/native/task.c
+++ b/ksrc/skins/native/task.c
@@ -74,6 +74,11 @@ static void __task_delete_hook(xnthread_t *thread)
 
task = thread2rtask(thread);
 
+#if defined(CONFIG_XENO_OPT_NATIVE_MPS) && defined(CONFIG_XENO_FASTSYNCH)
+   xnheap_free(&xnsys_ppd_get(0)->sem_heap,
+   task->msendq.fastlock);
+#endif
+
 #ifdef CONFIG_XENO_OPT_NATIVE_MPS
/* The nucleus will reschedule as needed when all the deletion
   hooks are done. */
@@ -640,11 +645,6 @@ int rt_task_delete(RT_TASK *task)
if (err)
goto unlock_and_exit;
 
-#if defined(CONFIG_XENO_OPT_NATIVE_MPS) && defined(CONFIG_XENO_FASTSYNCH)
-   xnheap_free(&xnsys_ppd_get(0)->sem_heap,
-   task->msendq.fastlock);
-#endif
-
/* Does not return if task is current. */
xnpod_delete_thread(&task->thread_base);
 


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : nucleus: allocate u_mode in process private heap

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: 95e5b6d403feacae87ae313dc2e102d51bb767c4
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=95e5b6d403feacae87ae313dc2e102d51bb767c4

Author: Gilles Chanteperdrix 
Date:   Sat Jun 18 19:05:51 2011 +0200

nucleus: allocate u_mode in process private heap

---

 include/asm-generic/bits/current.h |   23 +
 include/asm-generic/syscall.h  |3 +-
 include/nucleus/shadow.h   |2 +-
 include/nucleus/thread.h   |2 +-
 include/nucleus/vdso.h |7 +--
 ksrc/nucleus/shadow.c  |   74 ++---
 ksrc/skins/native/syscall.c|2 +-
 ksrc/skins/posix/syscall.c |   20 
 ksrc/skins/psos+/syscall.c |2 +-
 ksrc/skins/uitron/syscall.c|7 ++-
 ksrc/skins/vrtx/syscall.c  |2 +-
 ksrc/skins/vxworks/syscall.c   |2 +-
 src/skins/common/current.c |   92 +++-
 src/skins/common/sem_heap.c|2 -
 src/skins/native/task.c|   13 ++---
 src/skins/posix/thread.c   |   62 ++--
 src/skins/psos+/task.c |   11 +++-
 src/skins/uitron/task.c|   11 +---
 src/skins/vrtx/task.c  |4 +-
 src/skins/vxworks/taskLib.c|4 +-
 20 files changed, 117 insertions(+), 228 deletions(-)

diff --git a/include/asm-generic/bits/current.h 
b/include/asm-generic/bits/current.h
index 79123e8..0574c55 100644
--- a/include/asm-generic/bits/current.h
+++ b/include/asm-generic/bits/current.h
@@ -11,9 +11,10 @@ unsigned long xeno_slow_get_current_mode(void);
 void xeno_current_warn_old(void);
 
 #ifdef HAVE___THREAD
-extern __thread xnhandle_t xeno_current __attribute__ ((tls_model 
("initial-exec")));
-extern __thread unsigned long
-xeno_current_mode __attribute__ ((tls_model ("initial-exec")));
+extern __thread __attribute__ ((tls_model ("initial-exec")))
+xnhandle_t xeno_current;
+extern __thread __attribute__ ((tls_model ("initial-exec")))
+unsigned long *xeno_current_mode;
 
 static inline xnhandle_t xeno_get_current(void)
 {
@@ -24,9 +25,7 @@ static inline xnhandle_t xeno_get_current(void)
 
 static inline unsigned long xeno_get_current_mode(void)
 {
-   unsigned long mode = xeno_current_mode;
-
-   return mode == -1 ? xeno_slow_get_current_mode() : mode;
+   return *xeno_current_mode;
 }
 
 #else /* ! HAVE___THREAD */
@@ -53,17 +52,19 @@ static inline xnhandle_t xeno_get_current_fast(void)
 
 static inline unsigned long xeno_get_current_mode(void)
 {
-   unsigned long *mode = pthread_getspecific(xeno_current_mode_key);
+   unsigned long *mode;
+
+   mode = pthread_getspecific(xeno_current_mode_key);
 
-   return mode ? (*mode) : xeno_slow_get_current_mode();
+   return *mode;
 }
 
 #endif /* ! HAVE___THREAD */
 
-void xeno_set_current(void);
+void xeno_init_current_keys(void);
 
-unsigned long *xeno_init_current_mode(void);
+void xeno_set_current(void);
 
-void xeno_init_current_keys(void);
+void xeno_set_current_mode(unsigned long offset);
 
 #endif /* _XENO_ASM_GENERIC_CURRENT_H */
diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h
index 89d148e..4154b46 100644
--- a/include/asm-generic/syscall.h
+++ b/include/asm-generic/syscall.h
@@ -35,8 +35,7 @@
 #define __xn_sys_sem_heap  7
 #define __xn_sys_current   8   /* threadh = xnthread_handle(cur) */
 #define __xn_sys_current_info  9   /* r = xnshadow_current_info(&info) */
-#define __xn_sys_drop_u_mode   10  /* stop updating thread->u_mode */
-#define __xn_sys_mayday11  /* request mayday fixup */
+#define __xn_sys_mayday10  /* request mayday fixup */
 
 #define XENOMAI_LINUX_DOMAIN  0
 #define XENOMAI_XENO_DOMAIN   1
diff --git a/include/nucleus/shadow.h b/include/nucleus/shadow.h
index ad93058..9c8784c 100644
--- a/include/nucleus/shadow.h
+++ b/include/nucleus/shadow.h
@@ -63,7 +63,7 @@ void xnshadow_release_events(void);
 
 int xnshadow_map(struct xnthread *thread,
 xncompletion_t __user *u_completion,
-unsigned long __user *u_mode);
+unsigned long __user *u_mode_offset);
 
 void xnshadow_unmap(struct xnthread *thread);
 
diff --git a/include/nucleus/thread.h b/include/nucleus/thread.h
index 853a305..d5dc531 100644
--- a/include/nucleus/thread.h
+++ b/include/nucleus/thread.h
@@ -329,7 +329,7 @@ typedef struct xnthread {
void *cookie;   /* Cookie to pass to the entry routine */
 
 #ifdef CONFIG_XENO_OPT_PERVASIVE
-   unsigned long __user *u_mode;   /* Thread mode variable in userland. */
+   unsigned long *u_mode;  /* Thread mode variable shared with userland. */
 #endif /* CONFIG_XENO_OPT_PERVASIVE */
 
 XNARCH_DECL_DISPLAY_CONTEXT();
diff --git a/include/nucleus/vdso.h b/include/nucleus/vdso.h
index 279574b..42d2263 100644
--- a/include/nucleus/vdso.h
+++ b/include/nucleus/vdso.h
@@ -51,12 +51,11 @@ s

[Xenomai-git] Gilles Chanteperdrix : nucleus: print warning when destroying a heap with allocated data

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: 037b0e79e121cbcdc9397a35470a99777518f85f
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=037b0e79e121cbcdc9397a35470a99777518f85f

Author: Gilles Chanteperdrix 
Date:   Sun Jun 19 17:20:10 2011 +0200

nucleus: print warning when destroying a heap with allocated data

---

 ksrc/nucleus/heap.c |5 +
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/ksrc/nucleus/heap.c b/ksrc/nucleus/heap.c
index 0ab5114..0c1ceeb 100644
--- a/ksrc/nucleus/heap.c
+++ b/ksrc/nucleus/heap.c
@@ -1395,6 +1395,11 @@ void xnheap_destroy_mapped(xnheap_t *heap,
 */
XENO_ASSERT(NUCLEUS, mapaddr == NULL || release, /* nop */);
 
+   if (XENO_DEBUG(NUCLEUS) && heap->ubytes != 0)
+   printk(KERN_ERR "xnheap: destroying shared heap '%s' "
+  "with %lu bytes still in use.\n",
+  heap->label, heap->ubytes);
+
xnlock_get_irqsave(&nklock, s);
removeq(&heapq, &heap->stat_link);
xnvfile_touch_tag(&vfile_tag);


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : nucleus: allocate u_mode in process private heap

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: 0d3a0ab7574ed337bf551cdca678d899747c4479
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=0d3a0ab7574ed337bf551cdca678d899747c4479

Author: Gilles Chanteperdrix 
Date:   Sat Jun 18 19:05:51 2011 +0200

nucleus: allocate u_mode in process private heap

---

 include/asm-generic/bits/current.h |   23 +
 include/asm-generic/syscall.h  |3 +-
 include/nucleus/shadow.h   |2 +-
 include/nucleus/thread.h   |2 +-
 include/nucleus/vdso.h |7 +--
 ksrc/nucleus/shadow.c  |   74 ++---
 ksrc/skins/native/syscall.c|2 +-
 ksrc/skins/posix/syscall.c |   20 
 ksrc/skins/psos+/syscall.c |2 +-
 ksrc/skins/uitron/syscall.c|7 ++-
 ksrc/skins/vrtx/syscall.c  |2 +-
 ksrc/skins/vxworks/syscall.c   |2 +-
 src/skins/common/current.c |   92 +++-
 src/skins/common/sem_heap.c|2 -
 src/skins/native/task.c|   13 ++---
 src/skins/posix/thread.c   |   62 ++--
 src/skins/psos+/task.c |   11 +++-
 src/skins/uitron/task.c|   11 +---
 src/skins/vrtx/task.c  |4 +-
 src/skins/vxworks/taskLib.c|4 +-
 20 files changed, 117 insertions(+), 228 deletions(-)

diff --git a/include/asm-generic/bits/current.h 
b/include/asm-generic/bits/current.h
index 79123e8..2f04c3e 100644
--- a/include/asm-generic/bits/current.h
+++ b/include/asm-generic/bits/current.h
@@ -11,9 +11,10 @@ unsigned long xeno_slow_get_current_mode(void);
 void xeno_current_warn_old(void);
 
 #ifdef HAVE___THREAD
-extern __thread xnhandle_t xeno_current __attribute__ ((tls_model 
("initial-exec")));
-extern __thread unsigned long
-xeno_current_mode __attribute__ ((tls_model ("initial-exec")));
+extern __thread __attribute__ ((tls_model ("initial-exec")))
+xnhandle_t xeno_current;
+extern __thread __attribute__ ((tls_model ("initial-exec")))
+unsigned long *xeno_current_mode;
 
 static inline xnhandle_t xeno_get_current(void)
 {
@@ -24,9 +25,7 @@ static inline xnhandle_t xeno_get_current(void)
 
 static inline unsigned long xeno_get_current_mode(void)
 {
-   unsigned long mode = xeno_current_mode;
-
-   return mode == -1 ? xeno_slow_get_current_mode() : mode;
+   return xeno_current_mode ? *xeno_current_mode : XNRELAX;
 }
 
 #else /* ! HAVE___THREAD */
@@ -53,17 +52,19 @@ static inline xnhandle_t xeno_get_current_fast(void)
 
 static inline unsigned long xeno_get_current_mode(void)
 {
-   unsigned long *mode = pthread_getspecific(xeno_current_mode_key);
+   unsigned long *mode;
+
+   mode = pthread_getspecific(xeno_current_mode_key);
 
-   return mode ? (*mode) : xeno_slow_get_current_mode();
+   return mode ? *mode : XNRELAX;
 }
 
 #endif /* ! HAVE___THREAD */
 
-void xeno_set_current(void);
+void xeno_init_current_keys(void);
 
-unsigned long *xeno_init_current_mode(void);
+void xeno_set_current(void);
 
-void xeno_init_current_keys(void);
+void xeno_set_current_mode(unsigned long offset);
 
 #endif /* _XENO_ASM_GENERIC_CURRENT_H */
diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h
index 89d148e..4154b46 100644
--- a/include/asm-generic/syscall.h
+++ b/include/asm-generic/syscall.h
@@ -35,8 +35,7 @@
 #define __xn_sys_sem_heap  7
 #define __xn_sys_current   8   /* threadh = xnthread_handle(cur) */
 #define __xn_sys_current_info  9   /* r = xnshadow_current_info(&info) */
-#define __xn_sys_drop_u_mode   10  /* stop updating thread->u_mode */
-#define __xn_sys_mayday11  /* request mayday fixup */
+#define __xn_sys_mayday10  /* request mayday fixup */
 
 #define XENOMAI_LINUX_DOMAIN  0
 #define XENOMAI_XENO_DOMAIN   1
diff --git a/include/nucleus/shadow.h b/include/nucleus/shadow.h
index ad93058..9c8784c 100644
--- a/include/nucleus/shadow.h
+++ b/include/nucleus/shadow.h
@@ -63,7 +63,7 @@ void xnshadow_release_events(void);
 
 int xnshadow_map(struct xnthread *thread,
 xncompletion_t __user *u_completion,
-unsigned long __user *u_mode);
+unsigned long __user *u_mode_offset);
 
 void xnshadow_unmap(struct xnthread *thread);
 
diff --git a/include/nucleus/thread.h b/include/nucleus/thread.h
index 853a305..d5dc531 100644
--- a/include/nucleus/thread.h
+++ b/include/nucleus/thread.h
@@ -329,7 +329,7 @@ typedef struct xnthread {
void *cookie;   /* Cookie to pass to the entry routine */
 
 #ifdef CONFIG_XENO_OPT_PERVASIVE
-   unsigned long __user *u_mode;   /* Thread mode variable in userland. */
+   unsigned long *u_mode;  /* Thread mode variable shared with userland. */
 #endif /* CONFIG_XENO_OPT_PERVASIVE */
 
 XNARCH_DECL_DISPLAY_CONTEXT();
diff --git a/include/nucleus/vdso.h b/include/nucleus/vdso.h
index 279574b..42d2263 100644
--- a/include/nucleus/vdso.h
+++

[Xenomai-git] Gilles Chanteperdrix : nucleus: add reference counter to sys_ppd

2011-06-23 Thread GIT version control
Module: xenomai-gch
Branch: u_mode
Commit: 35a7cf786986816fba2da8e633da276819d952d7
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=35a7cf786986816fba2da8e633da276819d952d7

Author: Gilles Chanteperdrix 
Date:   Thu Jun 23 22:57:59 2011 +0200

nucleus: add reference counter to sys_ppd

This way, if the main thread is shadowed and the last event is its
taskexit event, the ppd are destroyed at this point and not earlier.

---

 include/nucleus/sys_ppd.h |1 +
 ksrc/nucleus/shadow.c |   53 
 2 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/include/nucleus/sys_ppd.h b/include/nucleus/sys_ppd.h
index 3ae8581..665e973 100644
--- a/include/nucleus/sys_ppd.h
+++ b/include/nucleus/sys_ppd.h
@@ -10,6 +10,7 @@ struct xnsys_ppd {
 #ifdef XNARCH_HAVE_MAYDAY
unsigned long mayday_addr;
 #endif
+   xnarch_atomic_t refcnt;
 #define ppd2sys(addr) container_of(addr, struct xnsys_ppd, ppd)
 };
 
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index dcda1e7..08ce462 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -673,6 +673,14 @@ static inline void ppd_remove_mm(struct mm_struct *mm,
xnlock_put_irqrestore(&nklock, s);
 }
 
+static void detach_ppd(xnshadow_ppd_t * ppd)
+{
+   unsigned muxid = xnshadow_ppd_muxid(ppd);
+   muxtable[muxid].props->eventcb(XNSHADOW_CLIENT_DETACH, ppd);
+   if (muxtable[muxid].props->module)
+   module_put(muxtable[muxid].props->module);
+}
+
 struct xnvdso *nkvdso;
 EXPORT_SYMBOL_GPL(nkvdso);
 
@@ -1237,9 +1245,11 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t 
__user *u_completion,
 {
struct xnthread_start_attr attr;
xnarch_cpumask_t affinity;
+   struct xnsys_ppd *sys_ppd;
unsigned int muxid, magic;
unsigned long *u_mode;
xnheap_t *sem_heap;
+   spl_t s;
int ret;
 
if (!xnthread_test_state(thread, XNSHADOW))
@@ -1278,7 +1288,11 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t 
__user *u_completion,
}
}
 
-   sem_heap = &xnsys_ppd_get(0)->sem_heap;
+   xnlock_get_irqsave(&nklock, s);
+   sys_ppd = xnsys_ppd_get(0);
+   xnlock_put_irqrestore(&nklock, s);
+
+   sem_heap = &sys_ppd->sem_heap;
u_mode = xnheap_alloc(sem_heap, sizeof(*u_mode));
if (!u_mode)
return -ENOMEM;
@@ -1317,6 +1331,7 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t 
__user *u_completion,
 */
xnshadow_thrptd(current) = thread;
xnshadow_mmptd(current) = current->mm;
+   xnarch_atomic_inc(&sys_ppd->refcnt);
 
rthal_enable_notifier(current);
 
@@ -1371,6 +1386,7 @@ EXPORT_SYMBOL_GPL(xnshadow_map);
 
 void xnshadow_unmap(xnthread_t *thread)
 {
+   struct xnsys_ppd *sys_ppd;
struct task_struct *p;
 
if (XENO_DEBUG(NUCLEUS) &&
@@ -1382,6 +1398,12 @@ void xnshadow_unmap(xnthread_t *thread)
xnthread_clear_state(thread, XNMAPPED);
rpi_pop(thread);
 
+   sys_ppd = xnsys_ppd_get(0);
+   xnheap_free(&sys_ppd->sem_heap, thread->u_mode);
+   thread->u_mode = NULL;
+
+   xnarch_atomic_dec(&sys_ppd->refcnt);
+
trace_mark(xn_nucleus, shadow_unmap,
   "thread %p thread_name %s pid %d",
   thread, xnthread_name(thread), p ? p->pid : -1);
@@ -1396,9 +1418,6 @@ void xnshadow_unmap(xnthread_t *thread)
 
xnshadow_thrptd(p) = NULL;
 
-   xnheap_free(&xnsys_ppd_get(0)->sem_heap, thread->u_mode);
-   thread->u_mode = NULL;
-
schedule_linux_call(LO_UNMAP_REQ, p, xnthread_get_magic(thread));
 }
 EXPORT_SYMBOL_GPL(xnshadow_unmap);
@@ -2119,14 +2138,14 @@ static void *xnshadow_sys_event(int event, void *data)
return ERR_PTR(err);
}
 #endif /* XNARCH_HAVE_MAYDAY */
-
+   xnarch_atomic_set(&p->refcnt, 1);
xnarch_atomic_inc(&muxtable[0].refcnt);
return &p->ppd;
 
case XNSHADOW_CLIENT_DETACH:
+   printk("sys detach !\n");
p = ppd2sys(data);
xnheap_destroy_mapped(&p->sem_heap, post_ppd_release, NULL);
-   xnarch_atomic_dec(&muxtable[0].refcnt);
 
return NULL;
}
@@ -2474,6 +2493,7 @@ RTHAL_DECLARE_EVENT(losyscall_event);
 static inline void do_taskexit_event(struct task_struct *p)
 {
xnthread_t *thread = xnshadow_thread(p); /* p == current */
+   struct xnsys_ppd *sys_ppd;
unsigned magic;
spl_t s;
 
@@ -2494,9 +2514,13 @@ static inline void do_taskexit_event(struct task_struct 
*p)
/* xnpod_delete_thread() -> hook -> xnshadow_unmap(). */
xnsched_set_resched(thread->sched);
xnpod_delete_thread(thread);
+   sys_ppd = xnsys_ppd_get(0);
xnlock_put_irqrestore(&nklock, s);
xnpod_schedule();
 
+   if (!xnarch_atomic_get(&sys_ppd->refcnt))
+   ppd_remove_mm(xns