]> Zhao Yanbai Git Server - minix.git/commitdiff
SMP - Free PDE slots are split among CPU
authorTomas Hruby <tom@minix3.org>
Wed, 15 Sep 2010 14:10:36 +0000 (14:10 +0000)
committerTomas Hruby <tom@minix3.org>
Wed, 15 Sep 2010 14:10:36 +0000 (14:10 +0000)
- cross-address space copies use these slots to map user memory for
  kernel. This avoid any collisions between CPUs

- well, we only have a single CPU running at a time, this is just to
  be safe for the future

kernel/arch/i386/memory.c

index 35fa5f6875cba631b5e5102e9ce85c91d752c3b6..e1307df69a602dd8ef816ce2e60f61d5c3907ed3 100644 (file)
@@ -31,7 +31,8 @@ PUBLIC int i386_paging_enabled = 0;
 
 PRIVATE int psok = 0;
 
-#define MAX_FREEPDES (3 * CONFIG_MAX_CPUS)
+#define FREE_PDES_PER_CPU      3
+#define MAX_FREEPDES           (FREE_PDES_PER_CPU * CONFIG_MAX_CPUS)
 PRIVATE int nfreepdes = 0, freepdes[MAX_FREEPDES];
 
 #define HASPT(procptr) ((procptr)->p_seg.p_cr3 != 0)
@@ -79,7 +80,12 @@ PRIVATE phys_bytes createpde(
        phys_bytes offset;
        int pde;
 
-       assert(free_pde_idx >= 0 && free_pde_idx < nfreepdes);
+       assert(free_pde_idx >= 0 && free_pde_idx < FREE_PDES_PER_CPU);
+
+       /* make the index CPU local */
+       free_pde_idx += cpuid * FREE_PDES_PER_CPU;
+       assert(free_pde_idx < nfreepdes);
+
        pde = freepdes[free_pde_idx];
        assert(pde >= 0 && pde < 1024);