[Xenomai-git] Gilles Chanteperdrix : nucleus: print warning when destroying a heap with allocated data
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
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
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
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
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
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
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
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
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
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
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