[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-forge Branch: master Commit: 51d743ba32f3e45b61ab257c484c33f2b3ba5d14 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=51d743ba32f3e45b61ab257c484c33f2b3ba5d14 Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the pointer to ppds in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 45 +--- include/cobalt/kernel/shadow.h| 22 +- kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 25 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 365 - 11 files changed, 197 insertions(+), 299 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 937f998..4ddd045 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -26,54 +26,35 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) +#define NR_PERSONALITIES 4 /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; char *exe_path; }; -extern struct xnsys_ppd __xnsys_global_ppd; - -static inline struct xnsys_ppd *__xnsys_ppd_get(int global) -{ - struct xnshadow_ppd *ppd; - - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) - return &__xnsys_global_ppd; +struct xnshadow_process { + struct mm_struct *mm; + void *priv[NR_PERSONALITIES]; + struct hlist_node hlink; + struct xnsys_ppd sys_ppd; +}; - return container_of(ppd, struct xnsys_ppd, ppd); -} +extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnsys_ppd *ppd; - spl_t s; + struct xnshadow_process *ppd; - xnlock_get_irqsave(&nklock, s); - ppd = __xnsys_ppd_get(global); - xnlock_put_irqrestore(&nklock, s); + if (global || (ppd = xnshadow_private_get(0)) == NULL) + return &__xnsys_global_ppd; - return ppd; + return &ppd->sys_ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..0b18aa0 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,8 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +struct xnshadow_process; struct xnpersonality { const char *name; @@ -39,8 +40,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *arg); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +61,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobalt/include/ipipe/thread_info.h index 4fec9dc..ebecfc8 100644 --- a/kernel/cobalt/include/ipipe/thread_info.h +++ b/kernel/cobalt/include/ipipe/thread_
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-forge Branch: next Commit: 51d743ba32f3e45b61ab257c484c33f2b3ba5d14 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=51d743ba32f3e45b61ab257c484c33f2b3ba5d14 Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the pointer to ppds in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 45 +--- include/cobalt/kernel/shadow.h| 22 +- kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 25 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 365 - 11 files changed, 197 insertions(+), 299 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 937f998..4ddd045 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -26,54 +26,35 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) +#define NR_PERSONALITIES 4 /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; char *exe_path; }; -extern struct xnsys_ppd __xnsys_global_ppd; - -static inline struct xnsys_ppd *__xnsys_ppd_get(int global) -{ - struct xnshadow_ppd *ppd; - - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) - return &__xnsys_global_ppd; +struct xnshadow_process { + struct mm_struct *mm; + void *priv[NR_PERSONALITIES]; + struct hlist_node hlink; + struct xnsys_ppd sys_ppd; +}; - return container_of(ppd, struct xnsys_ppd, ppd); -} +extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnsys_ppd *ppd; - spl_t s; + struct xnshadow_process *ppd; - xnlock_get_irqsave(&nklock, s); - ppd = __xnsys_ppd_get(global); - xnlock_put_irqrestore(&nklock, s); + if (global || (ppd = xnshadow_private_get(0)) == NULL) + return &__xnsys_global_ppd; - return ppd; + return &ppd->sys_ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..0b18aa0 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,8 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +struct xnshadow_process; struct xnpersonality { const char *name; @@ -39,8 +40,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *arg); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +61,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobalt/include/ipipe/thread_info.h index 4fec9dc..ebecfc8 100644 --- a/kernel/cobalt/include/ipipe/thread_info.h +++ b/kernel/cobalt/include/ipipe/thread_in
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: 51d743ba32f3e45b61ab257c484c33f2b3ba5d14 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=51d743ba32f3e45b61ab257c484c33f2b3ba5d14 Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the pointer to ppds in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 45 +--- include/cobalt/kernel/shadow.h| 22 +- kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 25 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 365 - 11 files changed, 197 insertions(+), 299 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 937f998..4ddd045 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -26,54 +26,35 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) +#define NR_PERSONALITIES 4 /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; char *exe_path; }; -extern struct xnsys_ppd __xnsys_global_ppd; - -static inline struct xnsys_ppd *__xnsys_ppd_get(int global) -{ - struct xnshadow_ppd *ppd; - - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) - return &__xnsys_global_ppd; +struct xnshadow_process { + struct mm_struct *mm; + void *priv[NR_PERSONALITIES]; + struct hlist_node hlink; + struct xnsys_ppd sys_ppd; +}; - return container_of(ppd, struct xnsys_ppd, ppd); -} +extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnsys_ppd *ppd; - spl_t s; + struct xnshadow_process *ppd; - xnlock_get_irqsave(&nklock, s); - ppd = __xnsys_ppd_get(global); - xnlock_put_irqrestore(&nklock, s); + if (global || (ppd = xnshadow_private_get(0)) == NULL) + return &__xnsys_global_ppd; - return ppd; + return &ppd->sys_ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..0b18aa0 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,8 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +struct xnshadow_process; struct xnpersonality { const char *name; @@ -39,8 +40,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *arg); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +61,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobalt/include/ipipe/thread_info.h index 4fec9dc..ebecfc8 100644 --- a/kernel/cobalt/include/ipipe/thread_info.h +++ b/kernel/cobalt/include/ipipe/thread_i
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: 0d6a28ef0eb42c87c99a25434eb875e6f2138c6f URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=0d6a28ef0eb42c87c99a25434eb875e6f2138c6f Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the pointer to ppds in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 31 +-- include/cobalt/kernel/shadow.h| 22 +- kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 25 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 365 - 11 files changed, 196 insertions(+), 286 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 937f998..b0de75a 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -26,42 +26,35 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) +#define NR_PERSONALITIES 4 /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; char *exe_path; }; +struct xnshadow_process { + struct mm_struct *mm; + void *priv[NR_PERSONALITIES]; + struct hlist_node hlink; + struct xnsys_ppd sys_ppd; +}; + extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *__xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + struct xnshadow_process *ppd; - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) + if (global || (ppd = xnshadow_private_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return &ppd->sys_ppd; } static inline struct xnsys_ppd *xnsys_ppd_get(int global) diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..0b18aa0 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,8 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +struct xnshadow_process; struct xnpersonality { const char *name; @@ -39,8 +40,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *arg); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +61,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobalt/include/ipipe/thread_info.h index 4fec9dc..ebecfc8 100644 --- a/kernel/cobalt/include/ipipe/thread_info.h +++ b/kernel/cobalt/include/ipipe/thread_info.h @@ -20,17 +20,17 @@ #define _COBALT_IPIPE_THREAD_INFO_H struct xnthread; -struct mm_struct; +struct xnshadow_process; struct ipipe_threadinfo { struct xnthread *thread; - struct mm_struct *mm; + struct xnshadow_process *process; }; static inline void __ipipe_init_threadinfo(struct ipipe_
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: 7287e46a52a9f9f6d5e6c8a508b26031df986007 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=7287e46a52a9f9f6d5e6c8a508b26031df986007 Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the pointer to ppds in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 31 +-- include/cobalt/kernel/shadow.h| 22 +- kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 25 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 365 - 11 files changed, 196 insertions(+), 286 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 937f998..b0de75a 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -26,42 +26,35 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) +#define NR_PERSONALITIES 4 /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; char *exe_path; }; +struct xnshadow_process { + struct mm_struct *mm; + void *priv[NR_PERSONALITIES]; + struct hlist_node hlink; + struct xnsys_ppd sys_ppd; +}; + extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *__xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + struct xnshadow_process *ppd; - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) + if (global || (ppd = xnshadow_private_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return &ppd->sys_ppd; } static inline struct xnsys_ppd *xnsys_ppd_get(int global) diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..0b18aa0 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,8 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +struct xnshadow_process; struct xnpersonality { const char *name; @@ -39,8 +40,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *arg); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +61,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobalt/include/ipipe/thread_info.h index 4fec9dc..ebecfc8 100644 --- a/kernel/cobalt/include/ipipe/thread_info.h +++ b/kernel/cobalt/include/ipipe/thread_info.h @@ -20,17 +20,17 @@ #define _COBALT_IPIPE_THREAD_INFO_H struct xnthread; -struct mm_struct; +struct xnshadow_process; struct ipipe_threadinfo { struct xnthread *thread; - struct mm_struct *mm; + struct xnshadow_process *process; }; static inline void __ipipe_init_threadinfo(struct ipipe_
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: 3756d381e6ac5b36718b670f0a34e2068945ea8f URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=3756d381e6ac5b36718b670f0a34e2068945ea8f Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the pointer to ppds in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 31 +-- include/cobalt/kernel/shadow.h| 22 +- kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 25 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 369 - 11 files changed, 196 insertions(+), 290 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 937f998..b0de75a 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -26,42 +26,35 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) +#define NR_PERSONALITIES 4 /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; char *exe_path; }; +struct xnshadow_process { + struct mm_struct *mm; + void *priv[NR_PERSONALITIES]; + struct hlist_node hlink; + struct xnsys_ppd sys_ppd; +}; + extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *__xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + struct xnshadow_process *ppd; - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) + if (global || (ppd = xnshadow_private_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return &ppd->sys_ppd; } static inline struct xnsys_ppd *xnsys_ppd_get(int global) diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..0b18aa0 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,8 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +struct xnshadow_process; struct xnpersonality { const char *name; @@ -39,8 +40,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *arg); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +61,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobalt/include/ipipe/thread_info.h index 4fec9dc..ebecfc8 100644 --- a/kernel/cobalt/include/ipipe/thread_info.h +++ b/kernel/cobalt/include/ipipe/thread_info.h @@ -20,17 +20,17 @@ #define _COBALT_IPIPE_THREAD_INFO_H struct xnthread; -struct mm_struct; +struct xnshadow_process; struct ipipe_threadinfo { struct xnthread *thread; - struct mm_struct *mm; + struct xnshadow_process *process; }; static inline void __ipipe_init_threadinfo(struct ipipe_
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: 1be469d0a177a79591debc9cd2da00b8e98895d4 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=1be469d0a177a79591debc9cd2da00b8e98895d4 Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the pointer to ppds in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 31 +-- include/cobalt/kernel/shadow.h| 22 +- kernel/cobalt/debug.c |3 - kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 18 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 380 - 12 files changed, 196 insertions(+), 297 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..c4cce3f 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -25,42 +25,35 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) +#define NR_PERSONALITIES 4 /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; char *exe_path; }; +struct xnshadow_process { + struct mm_struct *mm; + void *priv[NR_PERSONALITIES]; + struct hlist_node hlink; + struct xnsys_ppd sys_ppd; +}; + extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + struct xnshadow_process *ppd; - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) + if (global || (ppd = xnshadow_private_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return &ppd->sys_ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..0b18aa0 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,8 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +struct xnshadow_process; struct xnpersonality { const char *name; @@ -39,8 +40,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *arg); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +61,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c index 226c5ee..10fbb53 100644 --- a/kernel/cobalt/debug.c +++ b/kernel/cobalt/debug.c @@ -618,11 +618,8 @@ void xndebug_shadow_init(struct xnthread *thread) { struct xnsys_ppd *sys_ppd; size_t len; - spl_t s; - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); /* * The caller is current, so we know for sure that sys_ppd * will still be vali
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: 7ff57e0635f94eaf4ef606941b7fe48589f2f80b URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=7ff57e0635f94eaf4ef606941b7fe48589f2f80b Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the pointer to ppds in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 31 +-- include/cobalt/kernel/shadow.h| 22 +- kernel/cobalt/debug.c |3 - kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 18 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 379 - 12 files changed, 195 insertions(+), 297 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..c4cce3f 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -25,42 +25,35 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) +#define NR_PERSONALITIES 4 /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; char *exe_path; }; +struct xnshadow_process { + struct mm_struct *mm; + void *priv[NR_PERSONALITIES]; + struct hlist_node hlink; + struct xnsys_ppd sys_ppd; +}; + extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + struct xnshadow_process *ppd; - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) + if (global || (ppd = xnshadow_private_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return &ppd->sys_ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..0b18aa0 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,8 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +struct xnshadow_process; struct xnpersonality { const char *name; @@ -39,8 +40,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *arg); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +61,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c index 226c5ee..10fbb53 100644 --- a/kernel/cobalt/debug.c +++ b/kernel/cobalt/debug.c @@ -618,11 +618,8 @@ void xndebug_shadow_init(struct xnthread *thread) { struct xnsys_ppd *sys_ppd; size_t len; - spl_t s; - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); /* * The caller is current, so we know for sure that sys_ppd * will still be vali
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: e074d13e7d0be31e6f0c50cb0ff257d8f173b193 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=e074d13e7d0be31e6f0c50cb0ff257d8f173b193 Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the ppd in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 24 +-- include/cobalt/kernel/shadow.h| 28 ++- kernel/cobalt/debug.c |3 - kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 18 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 335 - 12 files changed, 172 insertions(+), 275 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..20d6a6f 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -25,26 +25,10 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) - /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; @@ -55,12 +39,12 @@ extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + struct xnsys_ppd *ppd; - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) + if (global || (ppd = xnshadow_private_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..7daa318 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,14 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +#define NR_PERSONALITIES 4 + +struct xnshadow_process { + struct mm_struct *mm; + void *arg[NR_PERSONALITIES]; + struct hlist_node hlink; +}; struct xnpersonality { const char *name; @@ -39,8 +46,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *arg); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +67,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c index 226c5ee..10fbb53 100644 --- a/kernel/cobalt/debug.c +++ b/kernel/cobalt/debug.c @@ -618,11 +618,8 @@ void xndebug_shadow_init(struct xnthread *thread) { struct xnsys_ppd *sys_ppd; size_t len; - spl_t s; - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); /* * The caller is current, so we know for sure that sys_ppd * will still be valid after we dropped the lock. diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobal
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: d8e92ca5f4b3c43564ee2c5ce3a516d76a37b29c URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=d8e92ca5f4b3c43564ee2c5ce3a516d76a37b29c Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the ppd in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 24 +-- include/cobalt/kernel/shadow.h| 28 ++- kernel/cobalt/debug.c |3 - kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 18 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 335 - 12 files changed, 172 insertions(+), 275 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..20d6a6f 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -25,26 +25,10 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) - /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; @@ -55,12 +39,12 @@ extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + struct xnsys_ppd *ppd; - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) + if (global || (ppd = xnshadow_private_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..db5661b 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,14 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +#define NR_PERSONALITIES 4 + +struct xnshadow_process { + struct mm_struct *mm; + void *arg[NR_PERSONALITIES]; + struct hlist_node hlink; +}; struct xnpersonality { const char *name; @@ -39,8 +46,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *ppd); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +67,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c index 226c5ee..10fbb53 100644 --- a/kernel/cobalt/debug.c +++ b/kernel/cobalt/debug.c @@ -618,11 +618,8 @@ void xndebug_shadow_init(struct xnthread *thread) { struct xnsys_ppd *sys_ppd; size_t len; - spl_t s; - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); /* * The caller is current, so we know for sure that sys_ppd * will still be valid after we dropped the lock. diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobal
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: 1c3504760f67f8b6e6a7950bd1a080b5455bc6d8 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=1c3504760f67f8b6e6a7950bd1a080b5455bc6d8 Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the ppd in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 24 +-- include/cobalt/kernel/shadow.h| 28 ++- kernel/cobalt/debug.c |3 - kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 18 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 335 - 12 files changed, 172 insertions(+), 275 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..20d6a6f 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -25,26 +25,10 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) - /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; @@ -55,12 +39,12 @@ extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + struct xnsys_ppd *ppd; - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) + if (global || (ppd = xnshadow_private_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..db5661b 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,14 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +#define NR_PERSONALITIES 4 + +struct xnshadow_process { + struct mm_struct *mm; + void *arg[NR_PERSONALITIES]; + struct hlist_node hlink; +}; struct xnpersonality { const char *name; @@ -39,8 +46,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *ppd); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +67,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c index 226c5ee..10fbb53 100644 --- a/kernel/cobalt/debug.c +++ b/kernel/cobalt/debug.c @@ -618,11 +618,8 @@ void xndebug_shadow_init(struct xnthread *thread) { struct xnsys_ppd *sys_ppd; size_t len; - spl_t s; - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); /* * The caller is current, so we know for sure that sys_ppd * will still be valid after we dropped the lock. diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobal
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: ba5a274a2391fbfa657f63da961a1cdd0514a513 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=ba5a274a2391fbfa657f63da961a1cdd0514a513 Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the ppd in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 24 +-- include/cobalt/kernel/shadow.h| 28 ++- kernel/cobalt/debug.c |3 - kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h| 18 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |8 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 332 +++-- 12 files changed, 170 insertions(+), 274 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..20d6a6f 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -25,26 +25,10 @@ #include #include -struct mm_struct; - -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) - /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_private_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; @@ -55,12 +39,12 @@ extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + struct xnsys_ppd *ppd; - if (global || (ppd = xnshadow_ppd_get(0)) == NULL) + if (global || (ppd = xnshadow_private_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..db5661b 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,14 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +#define NR_PERSONALITIES 4 + +struct xnshadow_process { + struct mm_struct *mm; + void *arg[NR_PERSONALITIES]; + struct hlist_node hlink; +}; struct xnpersonality { const char *name; @@ -39,8 +46,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *ppd); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +67,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c index 226c5ee..10fbb53 100644 --- a/kernel/cobalt/debug.c +++ b/kernel/cobalt/debug.c @@ -618,11 +618,8 @@ void xndebug_shadow_init(struct xnthread *thread) { struct xnsys_ppd *sys_ppd; size_t len; - spl_t s; - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); /* * The caller is current, so we know for sure that sys_ppd * will still be valid after we dropped the lock. diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobal
[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism
Module: xenomai-gch Branch: for-forge Commit: 6f08a432956400f3ebb7ffe5b2963caf61ac36bf URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=6f08a432956400f3ebb7ffe5b2963caf61ac36bf Author: Gilles Chanteperdrix Date: Tue Jan 7 00:19:59 2014 +0100 cobalt: replace ppd mechanism Store the ppd in the ipipe_threadinfo structure in order to avoid the hash lookup most of the time. --- include/cobalt/kernel/ppd.h | 20 +-- include/cobalt/kernel/shadow.h| 28 +-- kernel/cobalt/include/ipipe/thread_info.h |6 +- kernel/cobalt/posix/internal.h|8 +- kernel/cobalt/posix/nsem.c|3 +- kernel/cobalt/posix/process.h |1 - kernel/cobalt/posix/syscall.c | 10 +- kernel/cobalt/rtdm/core.c |5 +- kernel/cobalt/rtdm/internal.h |2 - kernel/cobalt/rtdm/syscall.c |9 +- kernel/cobalt/shadow.c| 280 +++-- 11 files changed, 148 insertions(+), 224 deletions(-) diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..2bf5637 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -27,24 +27,10 @@ struct mm_struct; -struct xnshadow_ppd_key { - unsigned long muxid; - struct mm_struct *mm; -}; - -struct xnshadow_ppd { - struct xnshadow_ppd_key key; - struct list_head link; -}; - -#define xnshadow_ppd_muxid(ppd) ((ppd)->key.muxid) -#define xnshadow_ppd_mm(ppd)((ppd)->key.mm) - /* Called with nklock locked irqs off. */ -struct xnshadow_ppd *xnshadow_ppd_get(unsigned int muxid); +void *xnshadow_ppd_get(unsigned int muxid); struct xnsys_ppd { - struct xnshadow_ppd ppd; struct xnheap sem_heap; unsigned long mayday_addr; atomic_t refcnt; @@ -55,12 +41,12 @@ extern struct xnsys_ppd __xnsys_global_ppd; static inline struct xnsys_ppd *xnsys_ppd_get(int global) { - struct xnshadow_ppd *ppd; + void *ppd; if (global || (ppd = xnshadow_ppd_get(0)) == NULL) return &__xnsys_global_ppd; - return container_of(ppd, struct xnsys_ppd, ppd); + return ppd; } #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/shadow.h b/include/cobalt/kernel/shadow.h index 6423332..4d171eb 100644 --- a/include/cobalt/kernel/shadow.h +++ b/include/cobalt/kernel/shadow.h @@ -30,7 +30,14 @@ struct timespec; struct timeval; struct completion; struct module; -struct xnshadow_ppd; + +#define NR_PERSONALITIES 4 + +struct xnshadow_process { + struct mm_struct *mm; + void *ppd[NR_PERSONALITIES]; + struct hlist_node hlink; +}; struct xnpersonality { const char *name; @@ -39,8 +46,8 @@ struct xnpersonality { struct xnsyscall *syscalls; atomic_t refcnt; struct { - struct xnshadow_ppd *(*attach_process)(void); - void (*detach_process)(struct xnshadow_ppd *ppd); + void *(*attach_process)(void); + void (*detach_process)(void *ppd); struct xnpersonality *(*map_thread)(struct xnthread *thread); struct xnpersonality *(*relax_thread)(struct xnthread *thread); struct xnpersonality *(*harden_thread)(struct xnthread *thread); @@ -60,20 +67,21 @@ static inline struct xnthread *xnshadow_thread(struct task_struct *p) return ipipe_task_threadinfo(p)->thread; } -static inline struct mm_struct *xnshadow_current_mm(void) +static inline struct xnshadow_process *xnshadow_current_process(void) { - return ipipe_current_threadinfo()->mm; + return ipipe_current_threadinfo()->process; } -static inline struct mm_struct *xnshadow_swap_mm(struct mm_struct *mm) +static inline struct xnshadow_process * +xnshadow_swap_process(struct xnshadow_process *process) { struct ipipe_threadinfo *p = ipipe_current_threadinfo(); - struct mm_struct *oldmm; + struct xnshadow_process *old; - oldmm = p->mm; - p->mm = mm; + old = p->process; + p->process = process; - return oldmm; + return old; } int xnshadow_mount(void); diff --git a/kernel/cobalt/include/ipipe/thread_info.h b/kernel/cobalt/include/ipipe/thread_info.h index 4fec9dc..ebecfc8 100644 --- a/kernel/cobalt/include/ipipe/thread_info.h +++ b/kernel/cobalt/include/ipipe/thread_info.h @@ -20,17 +20,17 @@ #define _COBALT_IPIPE_THREAD_INFO_H struct xnthread; -struct mm_struct; +struct xnshadow_process; struct ipipe_threadinfo { struct xnthread *thread; - struct mm_struct *mm; + struct xnshadow_process *process; }; static inline void __ipipe_init_threadinfo(struct ipipe_threadinfo *p) { p->thread = NULL; - p->mm = NULL; + p->process = NULL; } #endif /* !_COBALT_IPIPE_THREAD_INFO_H */ diff --git a/kernel/cobalt/posix/internal.h b/kernel/cobalt/posix/internal.h index bf