diff options
author | Mike Larkin <mlarkin@cvs.openbsd.org> | 2012-07-12 09:44:10 +0000 |
---|---|---|
committer | Mike Larkin <mlarkin@cvs.openbsd.org> | 2012-07-12 09:44:10 +0000 |
commit | d40187adc5bc7d1340f27b3798c8af0d0e22e22c (patch) | |
tree | d08e7eb06b5a1d6b6566041cb9a511310a498348 | |
parent | 0bbb7d268e3f3366bd5d4465abcec2ec381f16a2 (diff) |
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.
-rw-r--r-- | sys/kern/subr_hibernate.c | 113 |
1 files changed, 12 insertions, 101 deletions
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 <ariane@stack.nl> @@ -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; + } } } |