|
@@ -267,33 +267,39 @@ static unsigned long obj_idx_to_offset(struct page *page,
|
|
|
return off + obj_idx * class_size;
|
|
|
}
|
|
|
|
|
|
+static void reset_page(struct page *page)
|
|
|
+{
|
|
|
+ clear_bit(PG_private, &page->flags);
|
|
|
+ clear_bit(PG_private_2, &page->flags);
|
|
|
+ set_page_private(page, 0);
|
|
|
+ page->mapping = NULL;
|
|
|
+ page->freelist = NULL;
|
|
|
+ reset_page_mapcount(page);
|
|
|
+}
|
|
|
+
|
|
|
static void free_zspage(struct page *first_page)
|
|
|
{
|
|
|
- struct page *nextp, *tmp;
|
|
|
+ struct page *nextp, *tmp, *head_extra;
|
|
|
|
|
|
BUG_ON(!is_first_page(first_page));
|
|
|
BUG_ON(first_page->inuse);
|
|
|
|
|
|
- nextp = (struct page *)page_private(first_page);
|
|
|
+ head_extra = (struct page *)page_private(first_page);
|
|
|
|
|
|
- clear_bit(PG_private, &first_page->flags);
|
|
|
- clear_bit(PG_private_2, &first_page->flags);
|
|
|
- set_page_private(first_page, 0);
|
|
|
- first_page->mapping = NULL;
|
|
|
- first_page->freelist = NULL;
|
|
|
- reset_page_mapcount(first_page);
|
|
|
+ reset_page(first_page);
|
|
|
__free_page(first_page);
|
|
|
|
|
|
/* zspage with only 1 system page */
|
|
|
- if (!nextp)
|
|
|
+ if (!head_extra)
|
|
|
return;
|
|
|
|
|
|
- list_for_each_entry_safe(nextp, tmp, &nextp->lru, lru) {
|
|
|
+ list_for_each_entry_safe(nextp, tmp, &head_extra->lru, lru) {
|
|
|
list_del(&nextp->lru);
|
|
|
- clear_bit(PG_private_2, &nextp->flags);
|
|
|
- nextp->index = 0;
|
|
|
+ reset_page(nextp);
|
|
|
__free_page(nextp);
|
|
|
}
|
|
|
+ reset_page(head_extra);
|
|
|
+ __free_page(head_extra);
|
|
|
}
|
|
|
|
|
|
/* Initialize a newly allocated zspage */
|