Add a monitor command gfp to get free pages
authorXiao Jia <stfairy@gmail.com>
Thu, 17 Sep 2015 03:38:45 +0000 (20:38 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 23 Sep 2015 20:46:28 +0000 (16:46 -0400)
This was useful in debugging buffer allocations in the mlx4 driver.

kern/include/monitor.h
kern/src/monitor.c

index 234317c..c8f5c34 100644 (file)
@@ -40,5 +40,6 @@ int mon_db(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_px(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_kpfret(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_ks(int argc, char **argv, struct hw_trapframe *hw_tf);
+int mon_gfp(int argc, char **argv, struct hw_trapframe *hw_tf);
 
 #endif // !ROS_KERN_MONITOR_H
index d3d9538..8020416 100644 (file)
@@ -68,6 +68,7 @@ static command_t commands[] = {
        { "px", "Toggle printx", mon_px},
        { "kpfret", "Attempt to idle after a kernel fault", mon_kpfret},
        { "ks", "Kernel scheduler hacks", mon_ks},
+       { "gfp", "Get free pages", mon_gfp },
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -1203,3 +1204,23 @@ usage:
        }
        return 0;
 }
+
+int mon_gfp(int argc, char **argv, struct hw_trapframe *hw_tf)
+{
+       size_t naddrpages = max_paddr / PGSIZE;
+       spin_lock_irqsave(&colored_page_free_list_lock);
+       printk("%9s %9s %9s\n", "start", "end", "size");
+       for (int i = 0; i < naddrpages; i++) {
+               int j;
+               for (j = i; j < naddrpages; j++) {
+                       if (!page_is_free(j))
+                               break;
+               }
+               if (j > i) {
+                       printk("%9d %9d %9d\n", i, j, j - i);
+                       i = j;
+               }
+       }
+       spin_unlock_irqsave(&colored_page_free_list_lock);
+       return 0;
+}