|
@@ -324,10 +324,7 @@ struct page_address_map {
|
|
|
struct list_head list;
|
|
|
};
|
|
|
|
|
|
-/*
|
|
|
- * page_address_map freelist, allocated from page_address_maps.
|
|
|
- */
|
|
|
-static struct list_head page_address_pool; /* freelist */
|
|
|
+static struct page_address_map page_address_maps[LAST_PKMAP];
|
|
|
|
|
|
/*
|
|
|
* Hash table bucket
|
|
@@ -392,12 +389,7 @@ void set_page_address(struct page *page, void *virtual)
|
|
|
|
|
|
pas = page_slot(page);
|
|
|
if (virtual) { /* Add */
|
|
|
- BUG_ON(list_empty(&page_address_pool));
|
|
|
-
|
|
|
- pam = list_entry(page_address_pool.next,
|
|
|
- struct page_address_map, list);
|
|
|
- list_del(&pam->list);
|
|
|
-
|
|
|
+ pam = &page_address_maps[PKMAP_NR((unsigned long)virtual)];
|
|
|
pam->page = page;
|
|
|
pam->virtual = virtual;
|
|
|
|
|
@@ -410,7 +402,6 @@ void set_page_address(struct page *page, void *virtual)
|
|
|
if (pam->page == page) {
|
|
|
list_del(&pam->list);
|
|
|
spin_unlock_irqrestore(&pas->lock, flags);
|
|
|
- list_add_tail(&pam->list, &page_address_pool);
|
|
|
goto done;
|
|
|
}
|
|
|
}
|
|
@@ -420,15 +411,10 @@ done:
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-static struct page_address_map page_address_maps[LAST_PKMAP];
|
|
|
-
|
|
|
void __init page_address_init(void)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
- INIT_LIST_HEAD(&page_address_pool);
|
|
|
- for (i = 0; i < ARRAY_SIZE(page_address_maps); i++)
|
|
|
- list_add(&page_address_maps[i].list, &page_address_pool);
|
|
|
for (i = 0; i < ARRAY_SIZE(page_address_htable); i++) {
|
|
|
INIT_LIST_HEAD(&page_address_htable[i].lh);
|
|
|
spin_lock_init(&page_address_htable[i].lock);
|