Re: [PATCH] [34/48] Suspend2 2.1.9.8 for 2.6.12: 610-extent.patch

Pekka Enberg
2005-07-06T14:15:39Z

On 7/6/05, Nigel Cunningham <nigel@suspend2.net> wrote:
> diff -ruNp 611-io.patch-old/kernel/power/suspend2_core/io.c 611-io.patch-new/kernel/power/suspend2_core/io.c
> --- 611-io.patch-old/kernel/power/suspend2_core/io.c 1970-01-01 10:00:00.000000000 +1000
> +++ 611-io.patch-new/kernel/power/suspend2_core/io.c 2005-07-05 23:48:59.000000000 +1000
> @@ -0,0 +1,1006 @@
> +/*
> + * kernel/power/io.c
> + *
> + * Copyright (C) 1998-2001 Gabor Kuti <seasons@fornax.hu>
> + * Copyright (C) 1998,2001,2002 Pavel Machek <pavel@suse.cz>
^

Whitespace damage (appears elsewhere too).

> + * Copyright (C) 2002-2003 Florent Chabaud <fchabaud@free.fr>
> + * Copyright (C) 2002-2005 Nigel Cunningham <nigel@suspend2.net>
> + *

[snip]

> + pc = size / 5;
> +
> + /* Write the data */
> + for (i=0; i<size; i++) {
> + int was_mapped = 0;
> + struct page * page = pfn_to_page(current_page_index);
> +
> + /* Status update */
> + if ((i+base) >= nextupdate)
> + nextupdate = suspend2_update_status(i + base, barmax,
> + " %d/%d MB ", MB(base+i+1), MB(barmax));
> +
> + if ((i + 1) == pc) {
> + printk("%d%%...", 20 * step);
> + step++;
> + pc = size * step / 5;
> + }
> +
> + /* Write */
> + was_mapped = suspend_map_kernel_page(page, 1);
> + ret = first_filter->ops.filter.write_chunk(page);
> + if (!was_mapped)
> + suspend_map_kernel_page(page, 0);
> +
> + if (ret) {
> + printk("Write chunk returned %d.\n", ret);
> + abort_suspend("Failed to write a chunk of the "
> + "image.");
> + error = -1;
> + goto write_pageset_free_buffers;
> + }
> +
> + /* Interactivity */
> + check_shift_keys(0, NULL);
> +
> + if (TEST_RESULT_STATE(SUSPEND_ABORTED)) {

Why is the above in upper case but test_action_state is in lower case?

> + abort_suspend("Aborting as requested.");
> + error = -1;
> + goto write_pageset_free_buffers;
> + }
> +
> + /* Prepare next */
> + current_page_index = __get_next_bit_on(*pageflags, current_page_index);
> + }
> +
> + printk("done.\n");
> +
> + suspend2_update_status(base+size, barmax, " %d/%d MB ",
> + MB(base+size), MB(barmax));
> +
> +write_pageset_free_buffers:
> +
> + /* Cleanup other plugins */
> + list_for_each_entry(this_plugin, &suspend_plugins, plugin_list) {
> + if (this_plugin->disabled)
> + continue;
> + if ((this_plugin->type == FILTER_PLUGIN) ||
> + (this_plugin->type == WRITER_PLUGIN))
> + continue;
> + if (this_plugin->write_cleanup)
> + this_plugin->write_cleanup();
> + }
> +
> + /* Flush data and cleanup */
> + list_for_each_entry(this_plugin, &suspend_filters, ops.filter.filter_list) {
> + if (this_plugin->disabled)
> + continue;
> + if (this_plugin->write_cleanup)
> + this_plugin->write_cleanup();
> + }
> + active_writer->write_cleanup();
> +
> + /* Statistics */
> + end_time = jiffies;
> +
> + if ((end_time - start_time) && (!TEST_RESULT_STATE(SUSPEND_ABORTED))) {
> + suspend_io_time[0][0] += size,
> + suspend_io_time[0][1] += (end_time - start_time);
> + }
> +
> + return error;
> +}
> +
> +/* read_pageset()
> + *
> + * Description: Read a pageset from disk.
> + * Arguments: pagedir: Pointer to the pagedir to be saved.
> + * whichtowrite: Controls what debugging output is printed.
> + * overwrittenpagesonly: Whether to read the whole pageset or
> + * only part.
> + * Returns: Zero on success or -1 on failure.
> + */
> +
> +static int read_pageset(struct pagedir * pagedir, int whichtoread,
> + int overwrittenpagesonly)
> +{
> + int nextupdate = 0, result = 0, base = 0;
> + int start_time, end_time, finish_at = pagedir->pageset_size;
> + int barmax = pagedir1.pageset_size + pagedir2.pageset_size;
> + int i, pc, step = 1;
> + struct suspend_plugin_ops * this_plugin, * first_filter = get_next_filter(NULL);
> + dyn_pageflags_t *pageflags;
> + int current_page_index;
> +
> + if (whichtoread == 1) {
> + suspend2_prepare_status(1, 1, "Reading kernel & process data...");
> + pageflags = &pageset1_copy_map;
> + } else {
> + suspend2_prepare_status(1, 0, "Reading caches...");
> + if (overwrittenpagesonly)
> + barmax = finish_at = min(pageset1_size, pageset2_size);
> + else {
> + base = pagedir1.pageset_size;
> + }
> + pageflags = &pageset2_map;
> + }
> +
> + start_time=jiffies;
> +
> + /* Initialise page transformers */
> + list_for_each_entry(this_plugin, &suspend_filters, ops.filter.filter_list) {
> + if (this_plugin->disabled)
> + continue;
> + if (this_plugin->read_init &&
> + this_plugin->read_init(whichtoread)) {
> + abort_suspend("Failed to initialise a filter.");
> + result = 1;
> + goto read_pageset_free_buffers;
> + }
> + }
> +
> + /* Initialise writer */
> + if (active_writer->read_init(whichtoread)) {
> + abort_suspend("Failed to initialise the writer.");
> + result = 1;
> + goto read_pageset_free_buffers;
> + }
> +
> + /* Initialise other plugins */
> + list_for_each_entry(this_plugin, &suspend_plugins, plugin_list) {
> + if (this_plugin->disabled)
> + continue;
> + if ((this_plugin->type == FILTER_PLUGIN) ||
> + (this_plugin->type == WRITER_PLUGIN))
> + continue;
> + if (this_plugin->read_init)
> + if (this_plugin->read_init(whichtoread)) {
> + SET_RESULT_STATE(SUSPEND_ABORTED);
> + goto read_pageset_free_buffers;
> + }
> + }
> +
> + current_page_index = __get_next_bit_on(*pageflags, -1);
> +
> + pc = finish_at / 5;

What's the magic number 5 that pops up everywhere?