diff options
-rw-r--r-- | mm/zsmalloc.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index c81f63e73c5f..839a48c3ca27 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c | |||
@@ -628,7 +628,7 @@ static void init_zspage(struct page *first_page, struct size_class *class) | |||
628 | while (page) { | 628 | while (page) { |
629 | struct page *next_page; | 629 | struct page *next_page; |
630 | struct link_free *link; | 630 | struct link_free *link; |
631 | unsigned int i, objs_on_page; | 631 | unsigned int i = 1; |
632 | 632 | ||
633 | /* | 633 | /* |
634 | * page->index stores offset of first object starting | 634 | * page->index stores offset of first object starting |
@@ -641,14 +641,10 @@ static void init_zspage(struct page *first_page, struct size_class *class) | |||
641 | 641 | ||
642 | link = (struct link_free *)kmap_atomic(page) + | 642 | link = (struct link_free *)kmap_atomic(page) + |
643 | off / sizeof(*link); | 643 | off / sizeof(*link); |
644 | objs_on_page = (PAGE_SIZE - off) / class->size; | ||
645 | 644 | ||
646 | for (i = 1; i <= objs_on_page; i++) { | 645 | while ((off += class->size) < PAGE_SIZE) { |
647 | off += class->size; | 646 | link->next = obj_location_to_handle(page, i++); |
648 | if (off < PAGE_SIZE) { | 647 | link += class->size / sizeof(*link); |
649 | link->next = obj_location_to_handle(page, i); | ||
650 | link += class->size / sizeof(*link); | ||
651 | } | ||
652 | } | 648 | } |
653 | 649 | ||
654 | /* | 650 | /* |
@@ -660,7 +656,7 @@ static void init_zspage(struct page *first_page, struct size_class *class) | |||
660 | link->next = obj_location_to_handle(next_page, 0); | 656 | link->next = obj_location_to_handle(next_page, 0); |
661 | kunmap_atomic(link); | 657 | kunmap_atomic(link); |
662 | page = next_page; | 658 | page = next_page; |
663 | off = (off + class->size) % PAGE_SIZE; | 659 | off %= PAGE_SIZE; |
664 | } | 660 | } |
665 | } | 661 | } |
666 | 662 | ||