All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
To: "M. Koehrer" <mathias_koehrer@domain.hid>
Cc: xenomai@xenomai.org
Subject: [Xenomai-help] Re: A fairly small rtnet/Xenomai...
Date: Wed, 27 Dec 2006 10:25:02 +0100	[thread overview]
Message-ID: <45923BEE.6020302@domain.hid> (raw)
In-Reply-To: <28348634.1166787644219.JavaMail.ngmail@domain.hid>

[-- Attachment #1: Type: text/plain, Size: 497 bytes --]

M. Koehrer wrote:
> Hi Philippe, 
> 
> I agree. To fix the root cause is actually the very best to do!
> This eases the life of users and developers.
> 
> Regards
> 
> Mathias

Hi Mathias,

here comes a workaround for the COW issue on Linux 2.6.19. The patch
relies on a new VM_NOCOW flag which should be set for real-time
application if you use Xenomai trunk.

It would be nice if you could test it.

Thanks in advance.

-- 
                                                 Gilles Chanteperdrix


[-- Attachment #2: vm-nocow-2.6.19.patch --]
[-- Type: text/x-patch, Size: 4658 bytes --]

diff -x '*~' -Naurdp linux-2.6.19/include/linux/mm.h linux-2.6.19-nocow/include/linux/mm.h
--- linux-2.6.19/include/linux/mm.h	2006-11-30 11:04:08.000000000 +0100
+++ linux-2.6.19-nocow/include/linux/mm.h	2006-12-27 10:03:09.000000000 +0100
@@ -166,6 +166,7 @@ extern unsigned int kobjsize(const void 
 #define VM_NONLINEAR	0x00800000	/* Is non-linear (remap_file_pages) */
 #define VM_MAPPED_COPY	0x01000000	/* T if mapped copy of data (nommu mmap) */
 #define VM_INSERTPAGE	0x02000000	/* The vma has had "vm_insert_page()" done on it */
+#define VM_NOCOW	0x10000000	/* Disable COW mapping for the vma */
 
 #ifndef VM_STACK_DEFAULT_FLAGS		/* arch can override this */
 #define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS
diff -x '*~' -Naurdp linux-2.6.19/mm/memory.c linux-2.6.19-nocow/mm/memory.c
--- linux-2.6.19/mm/memory.c	2006-11-30 11:04:14.000000000 +0100
+++ linux-2.6.19-nocow/mm/memory.c	2006-12-27 10:06:37.000000000 +0100
@@ -418,13 +418,41 @@ struct page *vm_normal_page(struct vm_ar
 	return pfn_to_page(pfn);
 }
 
+static inline void cow_user_page(struct page *dst, struct page *src, unsigned long va)
+{
+	/*
+	 * If the source page was a PFN mapping, we don't have
+	 * a "struct page" for it. We do a best-effort copy by
+	 * just copying from the original user address. If that
+	 * fails, we just zero-fill it. Live with it.
+	 */
+	if (unlikely(!src)) {
+		void *kaddr = kmap_atomic(dst, KM_USER0);
+		void __user *uaddr = (void __user *)(va & PAGE_MASK);
+
+		/*
+		 * This really shouldn't fail, because the page is there
+		 * in the page tables. But it might just be unreadable,
+		 * in which case we just give up and fill the result with
+		 * zeroes.
+		 */
+		if (__copy_from_user_inatomic(kaddr, uaddr, PAGE_SIZE))
+			memset(kaddr, 0, PAGE_SIZE);
+		kunmap_atomic(kaddr, KM_USER0);
+		flush_dcache_page(dst);
+		return;
+		
+	}
+	copy_user_highpage(dst, src, va);
+}
+
 /*
  * copy one vm_area from one task to the other. Assumes the page tables
  * already present in the new task to be cleared in the whole range
  * covered by this vma.
  */
 
-static inline void
+static inline int
 copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
 		pte_t *dst_pte, pte_t *src_pte, struct vm_area_struct *vma,
 		unsigned long addr, int *rss)
@@ -466,6 +494,25 @@ copy_one_pte(struct mm_struct *dst_mm, s
 	 * in the parent and the child
 	 */
 	if (is_cow_mapping(vm_flags)) {
+#ifdef CONFIG_IPIPE
+		if (((vm_flags|src_mm->def_flags) & (VM_LOCKED|VM_NOCOW)) == (VM_LOCKED|VM_NOCOW)) {
+			struct page *old_page = vm_normal_page(vma, addr, pte);
+			page = alloc_page_vma(GFP_HIGHUSER, vma, addr);
+			if (!page)
+				return -ENOMEM;
+
+			cow_user_page(page, old_page, addr);
+			pte = mk_pte(page, vma->vm_page_prot);
+			
+			if (vm_flags & VM_SHARED)
+				pte = pte_mkclean(pte);
+			pte = pte_mkold(pte);
+
+			page_dup_rmap(page);
+			rss[!!PageAnon(page)]++;
+			goto out_set_pte;
+		}
+#endif /* CONFIG_IPIPE */
 		ptep_set_wrprotect(src_mm, addr, src_pte);
 		pte = pte_wrprotect(pte);
 	}
@@ -487,6 +534,7 @@ copy_one_pte(struct mm_struct *dst_mm, s
 
 out_set_pte:
 	set_pte_at(dst_mm, addr, dst_pte, pte);
+	return 0;
 }
 
 static int copy_pte_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
@@ -524,7 +572,9 @@ again:
 			progress++;
 			continue;
 		}
-		copy_one_pte(dst_mm, src_mm, dst_pte, src_pte, vma, addr, rss);
+		if (copy_one_pte(dst_mm, src_mm, dst_pte,
+				 src_pte, vma, addr, rss))
+			return -ENOMEM;
 		progress += 8;
 	} while (dst_pte++, src_pte++, addr += PAGE_SIZE, addr != end);
 
@@ -1431,34 +1481,6 @@ static inline pte_t maybe_mkwrite(pte_t 
 	return pte;
 }
 
-static inline void cow_user_page(struct page *dst, struct page *src, unsigned long va)
-{
-	/*
-	 * If the source page was a PFN mapping, we don't have
-	 * a "struct page" for it. We do a best-effort copy by
-	 * just copying from the original user address. If that
-	 * fails, we just zero-fill it. Live with it.
-	 */
-	if (unlikely(!src)) {
-		void *kaddr = kmap_atomic(dst, KM_USER0);
-		void __user *uaddr = (void __user *)(va & PAGE_MASK);
-
-		/*
-		 * This really shouldn't fail, because the page is there
-		 * in the page tables. But it might just be unreadable,
-		 * in which case we just give up and fill the result with
-		 * zeroes.
-		 */
-		if (__copy_from_user_inatomic(kaddr, uaddr, PAGE_SIZE))
-			memset(kaddr, 0, PAGE_SIZE);
-		kunmap_atomic(kaddr, KM_USER0);
-		flush_dcache_page(dst);
-		return;
-		
-	}
-	copy_user_highpage(dst, src, va);
-}
-
 /*
  * This routine handles present pages, when users try to write
  * to a shared page. It is done by copying the page to a new address

  parent reply	other threads:[~2006-12-27  9:25 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-19  7:54 [Xenomai-help] NMI watchdog: Loading of xeno_native leads to reboot of PC M. Koehrer
2006-12-19  8:08 ` Jan Kiszka
2006-12-19  8:14   ` Re: [Xenomai-help] NMI watchdog: Loading of xeno_native leads to M. Koehrer
2006-12-19  8:29     ` Jan Kiszka
2006-12-19  8:59       ` Aw: " M. Koehrer
2006-12-19  9:26         ` [Xenomai-help] NMI watchdog: Loading of xeno_native leads M. Koehrer
2006-12-19  9:36           ` Jan Kiszka
2006-12-19 12:04             ` Aw: " M. Koehrer
2006-12-19 13:05               ` Gilles Chanteperdrix
2006-12-19 13:07               ` Jan Kiszka
2006-12-19 14:13                 ` Aw: " M. Koehrer
2006-12-20 13:25                 ` [Xenomai-help] A fairly small rtnet/Xenomai application that freezes the PC M. Koehrer
2006-12-20 13:58                   ` [Xenomai-help] " Jan Kiszka
2006-12-20 14:11                     ` [Xenomai-help] Aw: " M. Koehrer
2006-12-21  8:48                       ` [Xenomai-help] Re: Re: A fairly small rtnet/Xenomai application that freezes the M. Koehrer
2006-12-21  9:03                         ` [Xenomai-help] " Jan Kiszka
2006-12-21 10:21                           ` M. Koehrer
2006-12-21 10:45                             ` Dmitry Adamushko
2006-12-21 11:19                               ` [Xenomai-help] " M. Koehrer
2006-12-21 11:28                                 ` Philippe Gerum
2006-12-21 11:51                                   ` [Xenomai-help] Re: Re: Re: A fairly small rtnet/Xenomai M. Koehrer
2006-12-21 13:09                                     ` Dmitry Adamushko
2006-12-21 13:36                                       ` [Xenomai-help] " M. Koehrer
2006-12-21 14:13                                         ` Philippe Gerum
2006-12-21 15:00                                           ` [Xenomai-help] " M. Koehrer
2006-12-21 15:17                                             ` Dmitry Adamushko
2006-12-21 15:36                                               ` [Xenomai-help] " M. Koehrer
2006-12-21 15:43                                                 ` Dmitry Adamushko
2006-12-21 18:18                                                   ` [Xenomai-help] " Gilles Chanteperdrix
2006-12-22  9:06                                                     ` [Xenomai-help] " M. Koehrer
2006-12-22  9:24                                                       ` Dmitry Adamushko
2006-12-22  9:24                                                       ` [Xenomai-help] " Gilles Chanteperdrix
2006-12-22  9:38                                                         ` [Xenomai-help] " M. Koehrer
2006-12-22  9:40                                                         ` [Xenomai-help] " Dmitry Adamushko
2006-12-22 10:15                                                           ` Gilles Chanteperdrix
2006-12-22 10:27                                                             ` [Xenomai-help] " M. Koehrer
2006-12-22 10:42                                                               ` Dmitry Adamushko
2006-12-22 11:20                                                               ` Philippe Gerum
2006-12-22 11:40                                                                 ` [Xenomai-help] " M. Koehrer
2006-12-22 12:09                                                                   ` Philippe Gerum
2006-12-27  9:25                                                                   ` Gilles Chanteperdrix [this message]
2006-12-27  9:29                                                                     ` [Xenomai-help] Aw: " M. Koehrer
2006-12-27 10:44                                                                     ` [Xenomai-help] " Philippe Gerum
2007-01-02  8:23                                                                       ` M. Koehrer
2007-01-02  9:53                                                                         ` Philippe Gerum
2007-01-02 14:09                                                                           ` Niklaus Giger
2007-01-04 20:57                                                                           ` Niklaus Giger
2007-01-05 10:57                                                                             ` Philippe Gerum
2006-12-27 17:32                                                                     ` [Xenomai-help] COW-disable patch Philippe Gerum
2006-12-22 11:03                                                             ` [Xenomai-help] Re: A fairly small rtnet/Xenomai Jan Kiszka
2006-12-21 15:19                                           ` [Xenomai-help] Re: Re: Re: " M. Koehrer
2006-12-21 16:50                                             ` Jan Kiszka
2006-12-21 16:54                                             ` Philippe Gerum
2006-12-21 17:13                                         ` [Xenomai-help] " Jan Kiszka
2006-12-21 17:47                                           ` Jan Kiszka
2006-12-21 10:53                             ` [Xenomai-help] Re: A fairly small rtnet/Xenomai application that freezes the Gilles Chanteperdrix
2006-12-21 11:35                               ` [Xenomai-help] " M. Koehrer
2006-12-21 12:14                                 ` M. Koehrer
2006-12-21 11:35                               ` [Xenomai-help] " Jan Kiszka
2006-12-21 12:50                                 ` Dmitry Adamushko
2006-12-21 13:26                                   ` Gilles Chanteperdrix
2006-12-21 14:45                                     ` Gilles Chanteperdrix
2006-12-21 15:12                                       ` Dmitry Adamushko
2006-12-22  9:19                                 ` Gilles Chanteperdrix
2006-12-21 12:48                             ` Jan Kiszka
2006-12-19  9:26         ` Aw: Re: [Xenomai-help] NMI watchdog: Loading of xeno_native leads to Jan Kiszka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=45923BEE.6020302@domain.hid \
    --to=gilles.chanteperdrix@xenomai.org \
    --cc=mathias_koehrer@domain.hid \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.