From c92a73ed072974f910cad030ce4c9fbbd4772014 Mon Sep 17 00:00:00 2001 From: mlarkin Date: Thu, 12 Jul 2012 09:44:09 +0000 Subject: Temporarily don't do RLE page encoding in hibernate to fix some unpacking corruption seen earlier. This makes hibernate much slower but seems to fix the corruption problems seen on all machines we've tested on. --- sys/kern/subr_hibernate.c | 113 +++++----------------------------------------- 1 file changed, 12 insertions(+), 101 deletions(-) (limited to 'sys/kern/subr_hibernate.c') diff --git a/sys/kern/subr_hibernate.c b/sys/kern/subr_hibernate.c index 5edd5dc48be..7f585ebdb13 100644 --- a/sys/kern/subr_hibernate.c +++ b/sys/kern/subr_hibernate.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr_hibernate.c,v 1.41 2012/07/11 16:19:04 mlarkin Exp $ */ +/* $OpenBSD: subr_hibernate.c,v 1.42 2012/07/12 09:44:09 mlarkin Exp $ */ /* * Copyright (c) 2011 Ariane van der Steldt @@ -797,7 +797,7 @@ void hibernate_inflate_region(union hibernate_info *hiber_info, paddr_t dest, paddr_t src, size_t size) { - int rle, end_stream = 0 ; + int end_stream = 0 ; struct hibernate_zlib_state *hibernate_state; hibernate_state = (struct hibernate_zlib_state *)HIBERNATE_HIBALLOC_PAGE; @@ -809,19 +809,6 @@ hibernate_inflate_region(union hibernate_info *hiber_info, paddr_t dest, /* Flush cache and TLB */ hibernate_flush(); - /* Consume RLE skipped pages */ - do { - rle = hibernate_get_next_rle(); - if (rle == -1) { - end_stream = 1; - goto next_page; - } - - if (rle != 0) - dest += (rle * PAGE_SIZE); - - } while (rle != 0); - /* * Is this a special page? If yes, redirect the * inflate output to a scratch page (eg, discard it) @@ -838,7 +825,6 @@ hibernate_inflate_region(union hibernate_info *hiber_info, paddr_t dest, hibernate_flush(); end_stream = hibernate_inflate_page(); -next_page: dest += PAGE_SIZE; } while (!end_stream); } @@ -1252,7 +1238,7 @@ hibernate_write_chunks(union hibernate_info *hiber_info) struct hibernate_disk_chunk *chunks; vaddr_t hibernate_io_page = hiber_info->piglet_va + PAGE_SIZE; daddr_t blkctr = hiber_info->image_offset, offset = 0; - int i, rle; + int i; struct hibernate_zlib_state *hibernate_state; hibernate_state = (struct hibernate_zlib_state *)HIBERNATE_HIBALLOC_PAGE; @@ -1333,81 +1319,6 @@ hibernate_write_chunks(union hibernate_info *hiber_info) temp_inaddr = (inaddr & PAGE_MASK) + hibernate_copy_page; - if (hibernate_inflate_skip(hiber_info, inaddr)) - rle = 1; - else - rle = uvm_page_rle(inaddr); - - while (rle != 0 && inaddr < range_end) { - hibernate_state->hib_stream.next_in = - (char *)&rle; - hibernate_state->hib_stream.avail_in = - sizeof(rle); - hibernate_state->hib_stream.next_out = - (caddr_t)hibernate_io_page + - (PAGE_SIZE - out_remaining); - hibernate_state->hib_stream.avail_out = - out_remaining; - - if (deflate(&hibernate_state->hib_stream, - Z_PARTIAL_FLUSH) != Z_OK) - return (1); - - out_remaining = - hibernate_state->hib_stream.avail_out; - inaddr += (rle * PAGE_SIZE); - if (inaddr > range_end) - inaddr = range_end; - else - rle = uvm_page_rle(inaddr); - } - - if (out_remaining == 0) { - /* Filled up the page */ - nblocks = PAGE_SIZE / hiber_info->secsize; - - if (hiber_info->io_func(hiber_info->device, - blkctr, (vaddr_t)hibernate_io_page, - PAGE_SIZE, HIB_W, hiber_info->io_page)) - return (1); - - blkctr += nblocks; - out_remaining = PAGE_SIZE; - } - - /* Write '0' RLE code */ - if (inaddr < range_end) { - hibernate_state->hib_stream.next_in = - (char *)&rle; - hibernate_state->hib_stream.avail_in = - sizeof(rle); - hibernate_state->hib_stream.next_out = - (caddr_t)hibernate_io_page + - (PAGE_SIZE - out_remaining); - hibernate_state->hib_stream.avail_out = - out_remaining; - - if (deflate(&hibernate_state->hib_stream, - Z_PARTIAL_FLUSH) != Z_OK) - return (1); - - out_remaining = - hibernate_state->hib_stream.avail_out; - } - - if (out_remaining == 0) { - /* Filled up the page */ - nblocks = PAGE_SIZE / hiber_info->secsize; - - if (hiber_info->io_func(hiber_info->device, - blkctr, (vaddr_t)hibernate_io_page, - PAGE_SIZE, HIB_W, hiber_info->io_page)) - return (1); - - blkctr += nblocks; - out_remaining = PAGE_SIZE; - } - /* Deflate from temp_inaddr to IO page */ if (inaddr != range_end) { pmap_kenter_pa(hibernate_temp_page, @@ -1421,18 +1332,18 @@ hibernate_write_chunks(union hibernate_info *hiber_info) inaddr += hibernate_deflate(hiber_info, temp_inaddr, &out_remaining); } - } - if (out_remaining == 0) { - /* Filled up the page */ - nblocks = PAGE_SIZE / hiber_info->secsize; + if (out_remaining == 0) { + /* Filled up the page */ + nblocks = PAGE_SIZE / hiber_info->secsize; - if (hiber_info->io_func(hiber_info->device, - blkctr, (vaddr_t)hibernate_io_page, - PAGE_SIZE, HIB_W, hiber_info->io_page)) - return (1); + if (hiber_info->io_func(hiber_info->device, + blkctr, (vaddr_t)hibernate_io_page, + PAGE_SIZE, HIB_W, hiber_info->io_page)) + return (1); - blkctr += nblocks; + blkctr += nblocks; + } } } -- cgit v1.2.3-59-g8ed1b