Module: xenomai-forge
Branch: master
Commit: b1539948cf9b547734a269b58ca4693520f61ad2
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=b1539948cf9b547734a269b58ca4693520f61ad2

Author: Philippe Gerum <r...@xenomai.org>
Date:   Tue Jan  3 15:13:41 2012 +0100

cobalt: detect misplaced header in ipipe_post_work_root()

---

 include/asm-generic/bits/shadow.h    |    2 +-
 include/asm-generic/ipipe/wrappers.h |   11 ++++++++++-
 kernel/cobalt/mq.c                   |    2 +-
 kernel/cobalt/nucleus/shadow.c       |    4 ++--
 4 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/include/asm-generic/bits/shadow.h 
b/include/asm-generic/bits/shadow.h
index 05c113b..258a82e 100644
--- a/include/asm-generic/bits/shadow.h
+++ b/include/asm-generic/bits/shadow.h
@@ -57,7 +57,7 @@ static void do_lostage_work(unsigned int virq, void *cookie)
        }
 }
 
-void ipipe_post_work_root(struct ipipe_work_header *work)
+void __ipipe_post_work_root(struct ipipe_work_header *work)
 {
        unsigned long flags;
        void *tail;
diff --git a/include/asm-generic/ipipe/wrappers.h 
b/include/asm-generic/ipipe/wrappers.h
index f29b8bc..2f93095 100644
--- a/include/asm-generic/ipipe/wrappers.h
+++ b/include/asm-generic/ipipe/wrappers.h
@@ -211,7 +211,16 @@ static inline void ipipe_set_hooks(struct ipipe_domain 
*ipd,
        }
 }
 
-void ipipe_post_work_root(struct ipipe_work_header *work);
+void __ipipe_post_work_root(struct ipipe_work_header *work);
+
+#define ipipe_post_work_root(p, header)                        \
+       do {                                            \
+               void header_not_at_start(void);         \
+               if (offsetof(typeof(*(p)), header)) {   \
+                       header_not_at_start();          \
+               }                                       \
+               __ipipe_post_work_root(&(p)->header);   \
+       } while (0)
 
 static inline
 struct ipipe_threadinfo *ipipe_task_threadinfo(struct task_struct *p)
diff --git a/kernel/cobalt/mq.c b/kernel/cobalt/mq.c
index 42552b0..b0a83c5 100644
--- a/kernel/cobalt/mq.c
+++ b/kernel/cobalt/mq.c
@@ -172,7 +172,7 @@ static inline void cobalt_mq_destroy(cobalt_mq_t *mq)
        xnlock_put_irqrestore(&nklock, s);
        xnselect_destroy(&mq->read_select);
        xnselect_destroy(&mq->write_select);
-       ipipe_post_work_root(&freework.work);
+       ipipe_post_work_root(&freework, work);
 
        if (resched)
                xnpod_schedule();
diff --git a/kernel/cobalt/nucleus/shadow.c b/kernel/cobalt/nucleus/shadow.c
index 136c328..a28ce30 100644
--- a/kernel/cobalt/nucleus/shadow.c
+++ b/kernel/cobalt/nucleus/shadow.c
@@ -308,7 +308,7 @@ static void post_wakeup(struct task_struct *p)
                .task = p,
        };
 
-       ipipe_post_work_root(&wakework.work);
+       ipipe_post_work_root(&wakework, work);
 }
 
 struct lostage_signal {
@@ -1815,7 +1815,7 @@ void xnshadow_send_sig(xnthread_t *thread, int sig, int 
arg)
                .sigval = arg,
        };
 
-       ipipe_post_work_root(&sigwork.work);
+       ipipe_post_work_root(&sigwork, work);
 }
 EXPORT_SYMBOL_GPL(xnshadow_send_sig);
 


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

Reply via email to