[Xenomai-git] Gilles Chanteperdrix : cobalt: replace ppd mechanism

2014-02-15 Thread git repository hosting
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

2014-01-20 Thread git repository hosting
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

2014-01-19 Thread git repository hosting
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

2014-01-11 Thread git repository hosting
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

2014-01-11 Thread git repository hosting
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

2014-01-07 Thread git repository hosting
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

2014-01-07 Thread git repository hosting
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

2014-01-07 Thread git repository hosting
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

2014-01-07 Thread git repository hosting
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

2014-01-07 Thread git repository hosting
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

2014-01-07 Thread git repository hosting
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

2014-01-07 Thread git repository hosting
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

2014-01-06 Thread git repository hosting
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