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(¤t->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