Re: mm->context[NR_CPUS] and pci fix check [was Re: Alpha SCSI error on 2.4.0-test11]

From: Linus Torvalds (torvalds@transmeta.com)
Date: Fri Dec 15 2000 - 15:30:34 EST


In article <20001215164626.C16586@inspiron.random>,
Andrea Arcangeli <andrea@suse.de> wrote:
>On Fri, Dec 01, 2000 at 08:14:44PM +0100, Andrea Arcangeli wrote:
>> On Fri, Dec 01, 2000 at 10:19:44AM -0800, David S. Miller wrote:
>> > I would instead suggest to declare 'context' to be of an arch-specific
>> > defined type, much like "thread_struct" is.
>>
>> I agree, [..]
>
>Here it is:
>
> ftp://ftp.us.kernel.org/pub/linux/kernel/people/andrea/patches/v2.4/2.4.0-test12/alpha-ASN-SMP-races-2.4.x-2
>
>This one breaks all archs but i386 and alpha. If some arch maintainer likes me
>to update its arch blindly implementing mm_arch structure as an `unsigned long
>context' and fixing up the miscompilation I will do.

I would MUCH prefer to have just

        <asm/mmu.h>:

                typedef xxxxx mm_context_t;

        <linux/sched.h>:

                mm_context_t context;

and then we change all old architectures to just have

        typedef unsigned long mm_context_t;

and they need no changes at all.

For alpha, we'd have

        typedef unsigned long mm_context_t[NR_CPUS];

and for i386 we'd have

        typedef struct { } mm_context_t;

and no changes anywhere else. Suggested patch (based on Andrea's)
appended. Comments?

The only thing I really worry about that changed is the initialization
of "mm->context" in fork(). "dup_mmap()" used to clear the context, and
now it doesn't. Which means that we should check that
"init_new_context()" handles this right and doesn't depend on the
clearing. Other than that, this should just work for all architectures.

(Potential cleanup: move the x86 "segment" pointer into the mmu context)

Andrea, does this work for you on alpha?

                Linus

-----
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c
--- v2.4.0-test12/linux/arch/alpha/kernel/smp.c Sun Oct 8 10:50:04 2000
+++ linux/arch/alpha/kernel/smp.c Fri Dec 15 11:57:56 2000
@@ -106,8 +106,9 @@
 smp_store_cpu_info(int cpuid)
 {
         cpu_data[cpuid].loops_per_sec = loops_per_sec;
- cpu_data[cpuid].last_asn
- = (cpuid << WIDTH_HARDWARE_ASN) + ASN_FIRST_VERSION;
+ cpu_data[cpuid].last_asn = ASN_FIRST_VERSION;
+ cpu_data[cpuid].need_new_asn = 0;
+ cpu_data[cpuid].asn_lock = 0;
         local_irq_count(cpuid) = 0;
         local_bh_count(cpuid) = 0;
 }
@@ -898,12 +899,16 @@
         tbia();
 }
 
+#define asn_locked() (cpu_data[smp_processor_id()].asn_lock)
+
 static void
 ipi_flush_tlb_mm(void *x)
 {
         struct mm_struct *mm = (struct mm_struct *) x;
- if (mm == current->active_mm)
+ if (mm == current->active_mm && !asn_locked())
                 flush_tlb_current(mm);
+ else
+ flush_tlb_other(mm);
 }
 
 void
@@ -911,10 +916,18 @@
 {
         if (mm == current->active_mm) {
                 flush_tlb_current(mm);
- if (atomic_read(&mm->mm_users) <= 1)
+ if (atomic_read(&mm->mm_users) <= 1) {
+ int i, cpu, this_cpu = smp_processor_id();
+ for (i = 0; i < smp_num_cpus; i++) {
+ cpu = cpu_logical_map(i);
+ if (cpu == this_cpu)
+ continue;
+ if (mm->context[cpu])
+ mm->context[cpu] = 0;
+ }
                         return;
- } else
- flush_tlb_other(mm);
+ }
+ }
 
         if (smp_call_function(ipi_flush_tlb_mm, mm, 1, 1)) {
                 printk(KERN_CRIT "flush_tlb_mm: timed out\n");
@@ -931,8 +944,12 @@
 ipi_flush_tlb_page(void *x)
 {
         struct flush_tlb_page_struct *data = (struct flush_tlb_page_struct *)x;
- if (data->mm == current->active_mm)
- flush_tlb_current_page(data->mm, data->vma, data->addr);
+ struct mm_struct * mm = data->mm;
+
+ if (mm == current->active_mm && !asn_locked())
+ flush_tlb_current_page(mm, data->vma, data->addr);
+ else
+ flush_tlb_other(mm);
 }
 
 void
@@ -943,10 +960,18 @@
 
         if (mm == current->active_mm) {
                 flush_tlb_current_page(mm, vma, addr);
- if (atomic_read(&mm->mm_users) <= 1)
+ if (atomic_read(&mm->mm_users) <= 1) {
+ int i, cpu, this_cpu = smp_processor_id();
+ for (i = 0; i < smp_num_cpus; i++) {
+ cpu = cpu_logical_map(i);
+ if (cpu == this_cpu)
+ continue;
+ if (mm->context[cpu])
+ mm->context[cpu] = 0;
+ }
                         return;
- } else
- flush_tlb_other(mm);
+ }
+ }
 
         data.vma = vma;
         data.mm = mm;
@@ -968,8 +993,10 @@
 ipi_flush_icache_page(void *x)
 {
         struct mm_struct *mm = (struct mm_struct *) x;
- if (mm == current->active_mm)
+ if (mm == current->active_mm && !asn_locked())
                 __load_new_mm_context(mm);
+ else
+ flush_tlb_other(mm);
 }
 
 void
@@ -980,11 +1007,19 @@
         if ((vma->vm_flags & VM_EXEC) == 0)
                 return;
 
- mm->context = 0;
         if (mm == current->active_mm) {
                 __load_new_mm_context(mm);
- if (atomic_read(&mm->mm_users) <= 1)
+ if (atomic_read(&mm->mm_users) <= 1) {
+ int i, cpu, this_cpu = smp_processor_id();
+ for (i = 0; i < smp_num_cpus; i++) {
+ cpu = cpu_logical_map(i);
+ if (cpu == this_cpu)
+ continue;
+ if (mm->context[cpu])
+ mm->context[cpu] = 0;
+ }
                         return;
+ }
         }
 
         if (smp_call_function(ipi_flush_icache_page, mm, 1, 1)) {
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/arch/alpha/mm/fault.c linux/arch/alpha/mm/fault.c
--- v2.4.0-test12/linux/arch/alpha/mm/fault.c Tue Oct 31 12:42:25 2000
+++ linux/arch/alpha/mm/fault.c Fri Dec 15 11:57:57 2000
@@ -45,7 +45,7 @@
         unsigned long mmc;
 
         mmc = __get_new_mm_context(next_mm, smp_processor_id());
- next_mm->context = mmc;
+ next_mm->context[smp_processor_id()] = mmc;
         current->thread.asn = mmc & HARDWARE_ASN_MASK;
         current->thread.ptbr
           = ((unsigned long) next_mm->pgd - IDENT_ADDR) >> PAGE_SHIFT;
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-alpha/mmu.h linux/include/asm-alpha/mmu.h
--- v2.4.0-test12/linux/include/asm-alpha/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-alpha/mmu.h Fri Dec 15 12:05:12 2000
@@ -0,0 +1,7 @@
+#ifndef __ALPHA_MMU_H
+#define __ALPHA_MMU_H
+
+/* The alpha MMU context is one "unsigned long" bitmap per CPU */
+typedef unsigned long mm_context_t[NR_CPUS];
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-alpha/mmu_context.h linux/include/asm-alpha/mmu_context.h
--- v2.4.0-test12/linux/include/asm-alpha/mmu_context.h Thu Aug 10 13:30:05 2000
+++ linux/include/asm-alpha/mmu_context.h Fri Dec 15 12:07:51 2000
@@ -11,7 +11,6 @@
 #include <asm/system.h>
 #include <asm/machvec.h>
 
-
 /*
  * Force a context reload. This is needed when we change the page
  * table pointer or when we update the ASN of the current process.
@@ -93,12 +92,7 @@
 #endif /* CONFIG_SMP */
 
 #define WIDTH_HARDWARE_ASN 8
-#ifdef CONFIG_SMP
-#define WIDTH_THIS_PROCESSOR 5
-#else
-#define WIDTH_THIS_PROCESSOR 0
-#endif
-#define ASN_FIRST_VERSION (1UL << (WIDTH_THIS_PROCESSOR + WIDTH_HARDWARE_ASN))
+#define ASN_FIRST_VERSION (1UL << WIDTH_HARDWARE_ASN)
 #define HARDWARE_ASN_MASK ((1UL << WIDTH_HARDWARE_ASN) - 1)
 
 /*
@@ -137,19 +131,24 @@
 ev5_switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm,
               struct task_struct *next, long cpu)
 {
- /* Check if our ASN is of an older version, or on a different CPU,
- and thus invalid. */
- /* ??? If we have two threads on different cpus, we'll continually
- fight over the context. Find a way to record a per-mm, per-cpu
- value for the asn. */
+ /* Check if our ASN is of an older version, and thus invalid. */
+ unsigned long asn;
+ unsigned long mmc;
 
- unsigned long asn = cpu_last_asn(cpu);
- unsigned long mmc = next_mm->context;
-
+#ifdef CONFIG_SMP
+ cpu_data[cpu].asn_lock = 1;
+ barrier();
+#endif
+ asn = cpu_last_asn(cpu);
+ mmc = next_mm->context[cpu];
         if ((mmc ^ asn) & ~HARDWARE_ASN_MASK) {
                 mmc = __get_new_mm_context(next_mm, cpu);
- next_mm->context = mmc;
+ next_mm->context[cpu] = mmc;
         }
+#ifdef CONFIG_SMP
+ else
+ cpu_data[cpu].need_new_asn = 1;
+#endif
 
         /* Always update the PCB ASN. Another thread may have allocated
            a new mm->context (via flush_tlb_mm) without the ASN serial
@@ -179,6 +178,23 @@
 
 extern void __load_new_mm_context(struct mm_struct *);
 
+#ifdef CONFIG_SMP
+#define check_mmu_context() \
+do { \
+ int cpu = smp_processor_id(); \
+ cpu_data[cpu].asn_lock = 0; \
+ barrier(); \
+ if (cpu_data[cpu].need_new_asn) { \
+ struct mm_struct * mm = current->active_mm; \
+ cpu_data[cpu].need_new_asn = 0; \
+ if (!mm->context[cpu]) \
+ __load_new_mm_context(mm); \
+ } \
+} while(0)
+#else
+#define check_mmu_context() do { } while(0)
+#endif
+
 __EXTERN_INLINE void
 ev5_activate_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm)
 {
@@ -208,7 +224,10 @@
 extern inline int
 init_new_context(struct task_struct *tsk, struct mm_struct *mm)
 {
- mm->context = 0;
+ int i;
+
+ for (i = 0; i < smp_num_cpus; i++)
+ mm->context[cpu_logical_map(i)] = 0;
         tsk->thread.ptbr = ((unsigned long)mm->pgd - IDENT_ADDR) >> PAGE_SHIFT;
         return 0;
 }
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-alpha/pgalloc.h linux/include/asm-alpha/pgalloc.h
--- v2.4.0-test12/linux/include/asm-alpha/pgalloc.h Tue Oct 31 12:42:27 2000
+++ linux/include/asm-alpha/pgalloc.h Fri Dec 15 11:57:57 2000
@@ -38,29 +38,6 @@
 extern void smp_imb(void);
 #endif
 
-/* We need to flush the userspace icache after setting breakpoints in
- ptrace. I don't think it's needed in do_swap_page, or do_no_page,
- but I don't know how to get rid of it either.
-
- Instead of indiscriminately using imb, take advantage of the fact
- that icache entries are tagged with the ASN and load a new mm context. */
-/* ??? Ought to use this in arch/alpha/kernel/signal.c too. */
-
-#ifndef CONFIG_SMP
-static inline void
-flush_icache_page(struct vm_area_struct *vma, struct page *page)
-{
- if (vma->vm_flags & VM_EXEC) {
- struct mm_struct *mm = vma->vm_mm;
- mm->context = 0;
- if (current->active_mm == mm)
- __load_new_mm_context(mm);
- }
-}
-#else
-extern void flush_icache_page(struct vm_area_struct *vma, struct page *page);
-#endif
-
 
 /*
  * Use a few helper functions to hide the ugly broken ASN
@@ -83,8 +60,38 @@
 static inline void
 flush_tlb_other(struct mm_struct *mm)
 {
- mm->context = 0;
+ long * mmc = &mm->context[smp_processor_id()];
+ /*
+ * Check it's not zero first to avoid cacheline ping pong when
+ * possible.
+ */
+ if (*mmc)
+ *mmc = 0;
+}
+
+/* We need to flush the userspace icache after setting breakpoints in
+ ptrace. I don't think it's needed in do_swap_page, or do_no_page,
+ but I don't know how to get rid of it either.
+
+ Instead of indiscriminately using imb, take advantage of the fact
+ that icache entries are tagged with the ASN and load a new mm context. */
+/* ??? Ought to use this in arch/alpha/kernel/signal.c too. */
+
+#ifndef CONFIG_SMP
+static inline void
+flush_icache_page(struct vm_area_struct *vma, struct page *page)
+{
+ if (vma->vm_flags & VM_EXEC) {
+ struct mm_struct *mm = vma->vm_mm;
+ if (current->active_mm == mm)
+ __load_new_mm_context(mm);
+ else
+ mm->context[smp_processor_id()] = 0;
+ }
 }
+#else
+extern void flush_icache_page(struct vm_area_struct *vma, struct page *page);
+#endif
 
 /*
  * Flush just one page in the current TLB set.
@@ -140,7 +147,7 @@
  */
 static inline void flush_tlb(void)
 {
- flush_tlb_current(current->mm);
+ flush_tlb_current(current->active_mm);
 }
 
 /*
@@ -170,10 +177,10 @@
  */
 static inline void flush_tlb_mm(struct mm_struct *mm)
 {
- if (mm != current->mm)
- flush_tlb_other(mm);
- else
+ if (mm == current->active_mm)
                 flush_tlb_current(mm);
+ else
+ flush_tlb_other(mm);
 }
 
 /*
@@ -189,10 +196,10 @@
 {
         struct mm_struct * mm = vma->vm_mm;
 
- if (mm != current->mm)
- flush_tlb_other(mm);
- else
+ if (mm == current->active_mm)
                 flush_tlb_current_page(mm, vma, addr);
+ else
+ flush_tlb_other(mm);
 }
 
 /*
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-alpha/smp.h linux/include/asm-alpha/smp.h
--- v2.4.0-test12/linux/include/asm-alpha/smp.h Fri Aug 4 16:15:37 2000
+++ linux/include/asm-alpha/smp.h Fri Dec 15 11:57:57 2000
@@ -26,6 +26,8 @@
 struct cpuinfo_alpha {
         unsigned long loops_per_sec;
         unsigned long last_asn;
+ int need_new_asn;
+ int asn_lock;
         unsigned long *pgd_cache;
         unsigned long *pte_cache;
         unsigned long pgtable_cache_sz;
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-alpha/system.h linux/include/asm-alpha/system.h
--- v2.4.0-test12/linux/include/asm-alpha/system.h Tue Oct 31 12:42:27 2000
+++ linux/include/asm-alpha/system.h Fri Dec 15 11:57:57 2000
@@ -125,6 +125,7 @@
         current = (next); \
         pcbb = virt_to_phys(&current->thread); \
         (last) = alpha_switch_to(pcbb, (prev)); \
+ check_mmu_context(); \
 } while (0)
 
 extern struct task_struct* alpha_switch_to(unsigned long, struct task_struct*);
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-arm/mmu.h linux/include/asm-arm/mmu.h
--- v2.4.0-test12/linux/include/asm-arm/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/mmu.h Fri Dec 15 12:06:49 2000
@@ -0,0 +1,7 @@
+#ifndef __ARM_MMU_H
+#define __ARM_MMU_H
+
+/* The ARM doesn't have a mmu context */
+typedef struct { } mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-i386/mmu.h linux/include/asm-i386/mmu.h
--- v2.4.0-test12/linux/include/asm-i386/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-i386/mmu.h Fri Dec 15 12:06:15 2000
@@ -0,0 +1,7 @@
+#ifndef __i386_MMU_H
+#define __i386_MMU_H
+
+/* The i386 doesn't have a mmu context */
+typedef struct { } mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-i386/pgtable.h linux/include/asm-i386/pgtable.h
--- v2.4.0-test12/linux/include/asm-i386/pgtable.h Mon Dec 11 17:59:45 2000
+++ linux/include/asm-i386/pgtable.h Fri Dec 15 12:15:38 2000
@@ -284,7 +284,7 @@
 static inline int ptep_test_and_clear_dirty(pte_t *ptep) { return test_and_clear_bit(_PAGE_BIT_DIRTY, ptep); }
 static inline int ptep_test_and_clear_young(pte_t *ptep) { return test_and_clear_bit(_PAGE_BIT_ACCESSED, ptep); }
 static inline void ptep_set_wrprotect(pte_t *ptep) { clear_bit(_PAGE_BIT_RW, ptep); }
-static inline void ptep_mkdirty(pte_t *ptep) { set_bit(_PAGE_BIT_RW, ptep); }
+static inline void ptep_mkdirty(pte_t *ptep) { set_bit(_PAGE_BIT_DIRTY, ptep); }
 
 /*
  * Conversion functions: convert a page and protection to a page entry,
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-ia64/mmu.h linux/include/asm-ia64/mmu.h
--- v2.4.0-test12/linux/include/asm-ia64/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-ia64/mmu.h Fri Dec 15 12:14:07 2000
@@ -0,0 +1,7 @@
+#ifndef __MMU_H
+#define __MMU_H
+
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-m68k/mmu.h linux/include/asm-m68k/mmu.h
--- v2.4.0-test12/linux/include/asm-m68k/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-m68k/mmu.h Fri Dec 15 12:14:31 2000
@@ -0,0 +1,7 @@
+#ifndef __MMU_H
+#define __MMU_H
+
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-mips/mmu.h linux/include/asm-mips/mmu.h
--- v2.4.0-test12/linux/include/asm-mips/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-mips/mmu.h Fri Dec 15 12:11:59 2000
@@ -0,0 +1,7 @@
+#ifndef __MMU_H
+#define __MMU_H
+
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-mips64/mmu.h linux/include/asm-mips64/mmu.h
--- v2.4.0-test12/linux/include/asm-mips64/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-mips64/mmu.h Fri Dec 15 12:14:36 2000
@@ -0,0 +1,7 @@
+#ifndef __MMU_H
+#define __MMU_H
+
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-parisc/mmu.h linux/include/asm-parisc/mmu.h
--- v2.4.0-test12/linux/include/asm-parisc/mmu.h Mon Dec 11 17:59:45 2000
+++ linux/include/asm-parisc/mmu.h Fri Dec 15 12:13:04 2000
@@ -6,6 +6,10 @@
 #define _PARISC_MMU_H_
 
 #ifndef __ASSEMBLY__
+
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
 /* Hardware Page Table Entry */
 typedef struct _PTE {
         unsigned long v:1; /* Entry is valid */
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-ppc/mmu.h linux/include/asm-ppc/mmu.h
--- v2.4.0-test12/linux/include/asm-ppc/mmu.h Sun Nov 19 18:44:20 2000
+++ linux/include/asm-ppc/mmu.h Fri Dec 15 12:13:41 2000
@@ -6,6 +6,9 @@
 #ifndef _PPC_MMU_H_
 #define _PPC_MMU_H_
 
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
 #include <linux/config.h>
 
 #ifndef __ASSEMBLY__
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-s390/mmu.h linux/include/asm-s390/mmu.h
--- v2.4.0-test12/linux/include/asm-s390/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-s390/mmu.h Fri Dec 15 12:14:13 2000
@@ -0,0 +1,7 @@
+#ifndef __MMU_H
+#define __MMU_H
+
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-sh/mmu.h linux/include/asm-sh/mmu.h
--- v2.4.0-test12/linux/include/asm-sh/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-sh/mmu.h Fri Dec 15 12:13:41 2000
@@ -0,0 +1,7 @@
+#ifndef __MMU_H
+#define __MMU_H
+
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-sparc/mmu.h linux/include/asm-sparc/mmu.h
--- v2.4.0-test12/linux/include/asm-sparc/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-sparc/mmu.h Fri Dec 15 12:14:19 2000
@@ -0,0 +1,7 @@
+#ifndef __MMU_H
+#define __MMU_H
+
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/asm-sparc64/mmu.h linux/include/asm-sparc64/mmu.h
--- v2.4.0-test12/linux/include/asm-sparc64/mmu.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-sparc64/mmu.h Fri Dec 15 12:14:23 2000
@@ -0,0 +1,7 @@
+#ifndef __MMU_H
+#define __MMU_H
+
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_t;
+
+#endif
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/include/linux/sched.h linux/include/linux/sched.h
--- v2.4.0-test12/linux/include/linux/sched.h Mon Dec 11 17:59:45 2000
+++ linux/include/linux/sched.h Fri Dec 15 12:15:38 2000
@@ -18,6 +18,7 @@
 #include <asm/semaphore.h>
 #include <asm/page.h>
 #include <asm/ptrace.h>
+#include <asm/mmu.h>
 
 #include <linux/smp.h>
 #include <linux/tty.h>
@@ -208,7 +209,6 @@
         int map_count; /* number of VMAs */
         struct semaphore mmap_sem;
         spinlock_t page_table_lock;
- unsigned long context;
         unsigned long start_code, end_code, start_data, end_data;
         unsigned long start_brk, brk, start_stack;
         unsigned long arg_start, arg_end, env_start, env_end;
@@ -222,6 +222,7 @@
          * part of Linux does not know about any segments.
          */
         void * segments;
+ mm_context_t context;
 };
 
 #define INIT_MM(name) \
diff --exclude=Makefile -u --recursive --new-file v2.4.0-test12/linux/kernel/fork.c linux/kernel/fork.c
--- v2.4.0-test12/linux/kernel/fork.c Mon Dec 11 17:59:45 2000
+++ linux/kernel/fork.c Fri Dec 15 11:57:57 2000
@@ -133,7 +133,6 @@
         mm->mmap_avl = NULL;
         mm->mmap_cache = NULL;
         mm->map_count = 0;
- mm->context = 0;
         mm->cpu_vm_mask = 0;
         mm->swap_cnt = 0;
         mm->swap_address = 0;
-
To unsubscribe from this list: send the line "unsubscribe linux-alpha" in
the body of a message to majordomo@vger.kernel.org



This archive was generated by hypermail 2b29 : Fri Dec 15 2000 - 21:00:36 EST