Hi,
The appended patch makes s2disk and resume use LZO instead of LZF for
compression. The new code seems to be a bit faster than the old one, but this
may be my impression only.
If anyone can please test it on i386, I'd be grateful.
Greetings,
Rafael
---
Makefile | 2 +-
resume.c | 25 +++++++++++--------------
suspend.c | 54 +++++++++++++++++++++++++++++++++++-------------------
3 files changed, 47 insertions(+), 34 deletions(-)
Index: suspend/resume.c
===================================================================
--- suspend.orig/resume.c 2007-08-16 00:03:37.000000000 +0200
+++ suspend/resume.c 2007-08-16 13:13:49.000000000 +0200
@@ -26,9 +26,7 @@
#include <string.h>
#include <errno.h>
#ifdef CONFIG_COMPRESS
-#include <lzf.h>
-#else
-#define lzf_decompress(a, b, c, d) 0
+#include <lzo/lzo1x.h>
#endif
#include "swsusp.h"
@@ -282,21 +280,20 @@ static int restore(struct swap_map_handl
void *buf = handle->page_buffer;
block = (struct buf_block *)(handle->read_buffer + disp);
+#ifdef CONFIG_COMPRESS
if (decompress) {
- unsigned short cnt = block->size;
+ int error;
+ lzo_uint cnt = page_size;
- if (cnt == page_size) {
- memcpy(buf, block->data, page_size);
- } else if (cnt < page_size) {
- cnt = lzf_decompress(block->data, cnt, buf, page_size);
- if (cnt != page_size)
- return -ENODATA;
- } else {
+ error = lzo1x_decompress_safe((lzo_bytep)block->data,
+ block->size,
+ buf, &cnt, NULL);
+ if (error)
return -EINVAL;
- }
- block->size += sizeof(short);
- return block->size;
+ return cnt == page_size ?
+ block->size + sizeof(short) : -ENODATA;
}
+#endif
memcpy(buf, block, page_size);
return page_size;
}
Index: suspend/suspend.c
===================================================================
--- suspend.orig/suspend.c 2007-08-16 11:03:52.000000000 +0200
+++ suspend/suspend.c 2007-08-16 13:08:21.000000000 +0200
@@ -33,9 +33,7 @@
#include <signal.h>
#include <termios.h>
#ifdef CONFIG_COMPRESS
-#include <lzf.h>
-#else
-#define lzf_compress(a, b, c, d) 0
+#include <lzo/lzo1x.h>
#endif
#include "swsusp.h"
@@ -61,10 +59,11 @@ static int suspend_loglevel = SUSPEND_LO
static char compute_checksum;
#ifdef CONFIG_COMPRESS
static char compress;
+static long long compr_diff;
#else
#define compress 0
+#define compr_diff 0
#endif
-static unsigned long compr_diff;
#ifdef CONFIG_ENCRYPT
static char do_encrypt;
static char use_RSA;
@@ -269,6 +268,9 @@ struct swap_map_handle {
unsigned int k;
int dev, fd;
struct md5_ctx ctx;
+#ifdef CONFIG_COMPRESS
+ void *lzo_work_buffer;
+#endif
#ifdef CONFIG_ENCRYPT
unsigned char *encrypt_buffer;
#endif
@@ -285,9 +287,13 @@ init_swap_writer(struct swap_map_handle
handle->next_swap = (loff_t *)(handle->areas + handle->areas_per_page);
handle->page_buffer = (char *)buf + page_size;
handle->write_buffer = handle->page_buffer + page_size;
+ buf = handle->write_buffer + buffer_size;
+#ifdef CONFIG_COMPRESS
+ handle->lzo_work_buffer = buf;
+ buf += LZO1X_1_MEM_COMPRESS;
+#endif
#ifdef CONFIG_ENCRYPT
- handle->encrypt_buffer = (unsigned char *)(handle->write_buffer +
- buffer_size);
+ handle->encrypt_buffer = buf;
#endif
memset(handle->areas, 0, page_size);
handle->cur_swap = get_swap_page(dev);
@@ -312,22 +318,22 @@ static int prepare(struct swap_map_handl
void *buf = handle->page_buffer;
block = (struct buf_block *)(handle->write_buffer + disp);
+#ifdef CONFIG_COMPRESS
if (compress) {
- unsigned short cnt;
+ lzo_uint cnt;
- cnt = lzf_compress(buf, page_size,
- block->data, page_size - sizeof(short));
- if (!cnt) {
- memcpy(block->data, buf, page_size);
- cnt = page_size;
- } else {
- compr_diff += page_size - cnt;
- }
- compr_diff -= sizeof(short);
+ lzo1x_1_compress(buf, page_size, (lzo_bytep)block->data, &cnt,
+ handle->lzo_work_buffer);
block->size = cnt;
- cnt += sizeof(short);
- return cnt;
+ /* Sanity check, should not trigger */
+ if (cnt + sizeof(short) > max_block_size)
+ printf("WARNING!"
+ " Data size too large after compression!\n");
+ /* We have added a sizeof(short) field to the data */
+ compr_diff += page_size - cnt - sizeof(short);
+ return cnt + sizeof(short);
}
+#endif
memcpy(block, buf, page_size);
return page_size;
}
@@ -612,7 +618,13 @@ int write_image(int snapshot_fd, int res
if (compress) {
header->image_flags |= IMAGE_COMPRESSED;
- max_block_size += sizeof(short);
+ /*
+ * The formula below follows from the worst-case
+ * expansion calculation for LZO1. sizeof(short) is
+ * related to the size field in 'struct buf_block'
+ */
+ max_block_size += (page_size >> 4) + 67
+ + sizeof(short);
}
#ifdef CONFIG_ENCRYPT
@@ -1356,6 +1368,10 @@ int main(int argc, char *argv[])
buffer_size = BUFFER_PAGES * page_size;
mem_size = 3 * page_size + buffer_size;
+#ifdef CONFIG_COMPRESS
+ if (compress)
+ mem_size += LZO1X_1_MEM_COMPRESS;
+#endif
#ifdef CONFIG_ENCRYPT
if (do_encrypt)
mem_size += buffer_size;
Index: suspend/Makefile
===================================================================
--- suspend.orig/Makefile 2007-08-15 20:37:04.000000000 +0200
+++ suspend/Makefile 2007-08-16 11:47:28.000000000 +0200
@@ -41,7 +41,7 @@ endif
ifdef CONFIG_COMPRESS
CC_FLAGS += -DCONFIG_COMPRESS
-SWSUSP_LD_FLAGS += -llzf
+SWSUSP_LD_FLAGS += -llzo2
endif
ifdef CONFIG_ENCRYPT
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Suspend-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/suspend-devel