Fixed page coloring given __CONFIG_PAGE_COLOR__
authorKevin Klues <klueska@ros-dev.(none)>
Fri, 23 Apr 2010 22:51:21 +0000 (15:51 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:44 +0000 (17:35 -0700)
kern/src/colored_caches.c
kern/src/page_alloc.c

index 6796409..02662a2 100644 (file)
@@ -17,6 +17,7 @@
 #include <stdio.h>
 #include <atomic.h>
 #include <kmalloc.h>
+#include <page_alloc.h>
 
 #define l1 (available_caches.l1)
 #define l2 (available_caches.l2)
@@ -30,9 +31,13 @@ inline void init_cache_properties(cache_t *c, size_t sz_k, size_t wa, size_t cls
        c->sz_k = SINIT(sz_k);
        c->clsz = SINIT(clsz);
 
+#ifdef __CONFIG_PAGE_COLORING__
        //Added as optimization (derived from above);
        size_t nc = get_cache_num_page_colors(c);
        c->num_colors = SINIT(nc);
+#else
+       c->num_colors = 1;
+#endif
 }
 
 inline void init_free_cache_colors_map(cache_t* c) 
@@ -237,14 +242,20 @@ static inline void __cache_color_free(cache_t* c, uint8_t* colors_map)
 }
 
 uint8_t* cache_colors_map_alloc() {
+#ifdef __CONFIG_PAGE_COLORING__
        uint8_t* colors_map = kmalloc(llc_cache->num_colors, 0);
        if(colors_map)
                CLR_BITMASK(colors_map, llc_cache->num_colors);
        return colors_map;
+#else
+       return global_cache_colors_map;
+#endif
 }
 
 void cache_colors_map_free(uint8_t* colors_map) {
+#ifdef __CONFIG_PAGE_COLORING__
        kfree(colors_map);
+#endif
 }
 
 error_t cache_color_alloc(cache_t* c, uint8_t* colors_map) 
index 6531c3a..508fe05 100644 (file)
@@ -25,6 +25,13 @@ static void __page_incref(page_t *CT(1) page);
 static error_t __page_alloc_specific(page_t** page, size_t ppn);
 static error_t __page_free(page_t *CT(1) page);
 
+#ifdef __CONFIG_PAGE_COLORING__
+#define NUM_KERNEL_COLORS 8
+#else
+#define NUM_KERNEL_COLORS 1
+#endif
+
+
 // Global list of colors allocated to the general purpose memory allocator
 uint8_t* global_cache_colors_map;
 size_t global_next_color = 0;
@@ -34,7 +41,7 @@ void colored_page_alloc_init()
        global_cache_colors_map = 
               kmalloc(BYTES_FOR_BITMASK(llc_cache->num_colors), 0);
        CLR_BITMASK(global_cache_colors_map, llc_cache->num_colors);
-       for(int i = 0; i < llc_cache->num_colors/8; i++)
+       for(int i = 0; i < llc_cache->num_colors/NUM_KERNEL_COLORS; i++)
                cache_color_alloc(llc_cache, global_cache_colors_map);
 }
 
@@ -115,7 +122,6 @@ static error_t __page_alloc_specific(page_t** page, size_t ppn)
  * @return ESUCCESS on success
  * @return -ENOMEM  otherwise
  */
-#ifdef __CONFIG_PAGE_COLORING__
 error_t upage_alloc(struct proc* p, page_t** page, int zero)
 {
        spin_lock_irqsave(&colored_page_free_list_lock);
@@ -132,26 +138,6 @@ error_t upage_alloc(struct proc* p, page_t** page, int zero)
        }
        return ret;
 }
-#else 
-error_t upage_alloc(struct proc* p, page_t** page, int zero)
-{
-       ssize_t ret;
-       spin_lock_irqsave(&colored_page_free_list_lock);
-       if((ret = __page_alloc_from_color_range(page, global_next_color, 
-                                   llc_cache->num_colors - global_next_color)) < 0)
-               ret = __page_alloc_from_color_range(page, 0, global_next_color);
-
-       if(ret >= 0) {
-               if(zero)
-                       memset(page2kva(*page),0,PGSIZE);
-               global_next_color = ret;        
-               ret = ESUCCESS;
-       }
-       spin_unlock_irqsave(&colored_page_free_list_lock);
-       
-       return ret;
-}
-#endif
 
 error_t kpage_alloc(page_t** page) 
 {