summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Larkin <mlarkin@cvs.openbsd.org>2012-07-12 09:44:10 +0000
committerMike Larkin <mlarkin@cvs.openbsd.org>2012-07-12 09:44:10 +0000
commitd40187adc5bc7d1340f27b3798c8af0d0e22e22c (patch)
treed08e7eb06b5a1d6b6566041cb9a511310a498348
parent0bbb7d268e3f3366bd5d4465abcec2ec381f16a2 (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.c113
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;
+ }
}
}