+ lock_acquire (&pool->lock);
+ list_push_front (&pool->free_list, &page->elem);
+ lock_release (&pool->lock);
+}
+
+/* Initializes pool P as starting at START and ending at END,
+ naming it NAME for debugging purposes. */
+static void
+init_pool (struct pool *p, void *start, void *end, const char *name)
+{
+ ASSERT (pg_ofs (start) == 0);
+ ASSERT (pg_ofs (end) == 0);
+
+ printf ("%d kB allocated for %s.\n",
+ (PGSIZE / 1024) * (pg_no (end) - pg_no (start)), name);
+
+ lock_init (&p->lock, name);
+ p->start = p->uninit = start;
+ p->end = end;
+ list_init (&p->free_list);
+}
+
+/* Returns true if PAGE was allocated from POOL,
+ false otherwise. */
+static bool
+page_from_pool (const struct pool *pool, void *page_)
+{
+ uint8_t *page = page_;
+
+ return page >= pool->start && page < pool->uninit;