linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andrea Arcangeli <andrea@suse.de>
To: Linus Torvalds <torvalds@transmeta.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>, linux-kernel@vger.kernel.org
Subject: Re: Linux 2.4.1-ac15
Date: Sat, 24 Feb 2001 05:54:08 +0100	[thread overview]
Message-ID: <20010224055408.B32367@athlon.random> (raw)
In-Reply-To: <20010223214057.A22808@athlon.random> <Pine.LNX.4.10.10102231306140.21515-100000@penguin.transmeta.com> <20010224050402.A32367@athlon.random>
In-Reply-To: <20010224050402.A32367@athlon.random>; from andrea@suse.de on Sat, Feb 24, 2001 at 05:04:02AM +0100

This new one should be better. Using the spinlock for the SMP serialization is
ok because that's an extremely slow path.

diff -urN -X /home/andrea/bin/dontdiff 2.4.2/arch/i386/mm/fault.c 2.4.2aa/arch/i386/mm/fault.c
--- 2.4.2/arch/i386/mm/fault.c	Thu Feb 22 03:44:53 2001
+++ 2.4.2aa/arch/i386/mm/fault.c	Sat Feb 24 05:41:11 2001
@@ -326,23 +326,27 @@
 		int offset = __pgd_offset(address);
 		pgd_t *pgd, *pgd_k;
 		pmd_t *pmd, *pmd_k;
+		static spinlock_t lazy_vmalloc_lock = SPIN_LOCK_UNLOCKED;
+		unsigned long flags;
 
 		pgd = tsk->active_mm->pgd + offset;
 		pgd_k = init_mm.pgd + offset;
 
-		if (!pgd_present(*pgd)) {
-			if (!pgd_present(*pgd_k))
-				goto bad_area_nosemaphore;
+		spin_lock_irqsave(&lazy_vmalloc_lock, flags);
+		if (!pgd_present(*pgd) && pgd_present(*pgd_k)) {
 			set_pgd(pgd, *pgd_k);
+			spin_unlock_irqrestore(&lazy_vmalloc_lock, flags);
 			return;
 		}
-
 		pmd = pmd_offset(pgd, address);
 		pmd_k = pmd_offset(pgd_k, address);
 
-		if (pmd_present(*pmd) || !pmd_present(*pmd_k))
-			goto bad_area_nosemaphore;
-		set_pmd(pmd, *pmd_k);
-		return;
+		if (!pmd_present(*pmd) && pmd_present(*pmd_k)) {
+			set_pmd(pmd, *pmd_k);
+			spin_unlock_irqrestore(&lazy_vmalloc_lock, flags);
+			return;
+		}
+		spin_unlock_irqrestore(&lazy_vmalloc_lock, flags);
+		goto bad_area_nosemaphore;
 	}
 }
diff -urN -X /home/andrea/bin/dontdiff 2.4.2/arch/i386/mm/init.c 2.4.2aa/arch/i386/mm/init.c
--- 2.4.2/arch/i386/mm/init.c	Sat Feb 10 02:34:03 2001
+++ 2.4.2aa/arch/i386/mm/init.c	Fri Feb 23 19:09:25 2001
@@ -116,21 +116,13 @@
 	pte_t *pte;
 
 	pte = (pte_t *) __get_free_page(GFP_KERNEL);
-	if (pmd_none(*pmd)) {
-		if (pte) {
-			clear_page(pte);
-			set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)));
-			return pte + offset;
-		}
-		set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(get_bad_pte_table())));
-		return NULL;
+	if (pte) {
+		clear_page(pte);
+		set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)));
+		return pte + offset;
 	}
-	free_page((unsigned long)pte);
-	if (pmd_bad(*pmd)) {
-		__handle_bad_pmd_kernel(pmd);
-		return NULL;
-	}
-	return (pte_t *) pmd_page(*pmd) + offset;
+	set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(get_bad_pte_table())));
+	return NULL;
 }
 
 pte_t *get_pte_slow(pmd_t *pmd, unsigned long offset)
diff -urN -X /home/andrea/bin/dontdiff 2.4.2/include/asm-i386/pgalloc-3level.h 2.4.2aa/include/asm-i386/pgalloc-3level.h
--- 2.4.2/include/asm-i386/pgalloc-3level.h	Fri Dec  3 20:12:23 1999
+++ 2.4.2aa/include/asm-i386/pgalloc-3level.h	Fri Feb 23 19:03:14 2001
@@ -53,12 +53,9 @@
 		if (!page)
 			page = get_pmd_slow();
 		if (page) {
-			if (pgd_none(*pgd)) {
-				set_pgd(pgd, __pgd(1 + __pa(page)));
-				__flush_tlb();
-				return page + address;
-			} else
-				free_pmd_fast(page);
+			set_pgd(pgd, __pgd(1 + __pa(page)));
+			__flush_tlb();
+			return page + address;
 		} else
 			return NULL;
 	}


non pae mode is still untested but it should now have a chance to work.

Andrea

  reply	other threads:[~2001-02-24  4:53 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-02-15 23:15 Linux 2.4.1-ac15 Alan Cox
2001-02-19  9:47 ` Philipp Rumpf
2001-02-19 11:35   ` Alan Cox
2001-02-19 11:54     ` Philipp Rumpf
2001-02-19 16:03       ` Alan Cox
2001-02-19 16:21         ` Philipp Rumpf
2001-02-19 16:27           ` Alan Cox
2001-02-19 16:34             ` Philipp Rumpf
2001-02-19 16:41               ` Alan Cox
2001-02-19 16:48                 ` Philipp Rumpf
2001-02-19 17:03                   ` Alan Cox
2001-02-21  3:02       ` Rusty Russell
2001-02-21 12:01         ` Alan Cox
2001-02-22  2:05           ` Rusty Russell
2001-02-22 10:22             ` Alan Cox
2001-02-23  0:01               ` Philipp Rumpf
2001-02-22  2:27           ` Linus Torvalds
2001-02-22 10:29             ` Alan Cox
2001-02-23 20:40               ` Andrea Arcangeli
2001-02-23 21:09                 ` Linus Torvalds
2001-02-24  4:04                   ` Andrea Arcangeli
2001-02-24  4:54                     ` Andrea Arcangeli [this message]
2001-02-19 11:54     ` Keith Owens
2001-02-19 12:15       ` Philipp Rumpf
2001-02-19 13:15         ` Keith Owens
2001-02-19 13:25           ` Christoph Hellwig
2001-02-19 21:32             ` Keith Owens
2001-02-19 13:36           ` Philipp Rumpf
2001-02-19 15:23           ` Manfred Spraul
2001-02-19 16:04       ` Alan Cox
2001-02-19 21:52         ` Keith Owens
2001-02-20 12:29           ` Philipp Rumpf

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=20010224055408.B32367@athlon.random \
    --to=andrea@suse.de \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@transmeta.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).