On Fri, 2007-04-20 at 11:43 -0500, Jeff Weber wrote:
> On Tuesday 17 April 2007 14:17, Gilles Chanteperdrix wrote:
> > Jeff Weber wrote:
> >  > On Monday 16 April 2007 16:34, Gilles Chanteperdrix wrote:
> >  > > Jeff Weber wrote:
> >  > >  > On Monday 16 April 2007 15:43, Gilles Chanteperdrix wrote:
> >  > >  > > If the fault you observe is due to an access to some memory after
> >  > >  > > a call to fork or one of its derivative (such as system, popen,
> >  > >  > > etc...), the patch would have copied the whole real-time process
> >  > >  > > address space at fork time instead of setting up COW mappings.
> >  > >  >
> >  > >  > No process forks are involved.  Though mlockall() was called from
> >  > >  > Linux main(), and the page fault was encountered by a separate
> >  > >  > Xenomai task. Here's the task history:
> >  > >
> >  > > The fork may well be hidden in some library. The best way to know if
> >  > > there is really no fork is to register a callback with pthread_atfork.
> >  >
> >  > pthread_atfork confirms that there is no fork.
> >
> > Ok. I am afraid you will have to help us a bit. Could you try Xenomai
> > 2.3.1 in case the nocow patch magically solves your issue ?
> Indeed, stepping up to:
> 
> linux-2.6.20.3
> xenomai-2.3.1
> ipipe-1.7-03
> 
> magically solved my page faults.

Ok, so some memory which was referred to must have been lying in a COWed
shared VM page, since what 1.7-03 does is that it eagerly breaks COW for
all the virtual memory space available to real-time threads.

In case you really, really, really don't want to upgrade to 2.3.x for
product maintenance issues (albeit I would really, really, really
recommend it, because there are really, really, really nice improvements
there over 2.2.x), I've crafted a quick patch to disable ondemand VM
mappings with older Xenomai revs using recent I-pipe patches. IOW, this
patch against v2.2.x should allow you to run the latter over I-pipe
1.7-03, and make use of its COW-breaking feature (uncompiled, untested).

--- include/asm-generic/hal.h   (revision 2323)
+++ include/asm-generic/hal.h   (working copy)
@@ -304,6 +304,13 @@
 #define PF_EVNOTIFY  0
 #endif /* !PF_EVNOTIFY */
 
+#ifdef VM_PINNED
+#define rthal_disable_ondemand_mappings(tsk)   
ipipe_disable_ondemand_mappings(tsk)
+#else /* !VM_PINNED */
+/* In case the I-pipe does not allow disabling ondemand mappings. */
+#define rthal_disable_ondemand_mappings(tsk)   (0)
+#endif /* !VM_PINNED */
+
 #ifdef CONFIG_KGDB
 #define rthal_set_foreign_stack(ipd)   ipipe_set_foreign_stack(ipd)
 #define rthal_clear_foreign_stack(ipd) ipipe_clear_foreign_stack(ipd)
Index: ksrc/nucleus/shadow.c
===================================================================
--- ksrc/nucleus/shadow.c       (revision 2323)
+++ ksrc/nucleus/shadow.c       (working copy)
@@ -828,6 +828,14 @@
                        thread->name, current->pid,
                        xnthread_base_priority(thread));
 
+#ifdef CONFIG_MMU
+       if (!(current->mm->def_flags & VM_LOCKED))
+               send_sig(SIGXCPU, current, 1);
+       else
+               if ((err = rthal_disable_ondemand_mappings(current)))
+                       return err;
+#endif /* CONFIG_MMU */
+
        /* Switch on propagation of normal kernel events for the bound
           task. This is basically a per-task event filter which
           restricts event notifications (e.g. syscalls) to tasks
@@ -836,11 +844,6 @@
           plain (i.e. non-Xenomai) Linux tasks. */
        current->flags |= PF_EVNOTIFY;
 
-#ifdef CONFIG_MMU
-       if (!(current->mm->def_flags & VM_LOCKED))
-               send_sig(SIGXCPU, current, 1);
-#endif /* CONFIG_MMU */
-
        current->cap_effective |=
            CAP_TO_MASK(CAP_IPC_LOCK) |
            CAP_TO_MASK(CAP_SYS_RAWIO) | CAP_TO_MASK(CAP_SYS_NICE);
-- 
Philippe.



_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to