Messages in this thread Patch in this message | | | From | Nigel Cunningham <> | Subject | [Suspend2][ 08/19] [Suspend2] I/O main loop. | Date | Tue, 27 Jun 2006 08:36:25 +1000 |
| |
Main I/O loop in the core of Suspend2. Submits pages for I/O to the first plugin in the pipeline and sends status updates to any userui component.
Signed-off-by: Nigel Cunningham <nigel@suspend2.net>
kernel/power/io.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/kernel/power/io.c b/kernel/power/io.c index be13f42..f237231 100644 --- a/kernel/power/io.c +++ b/kernel/power/io.c @@ -241,3 +241,68 @@ static int rw_cleanup_modules(int rw) return result; } +/* + * do_rw_loop + * + * The main I/O loop for reading or writing pages. + */ +static int do_rw_loop(int write, int finish_at, dyn_pageflags_t *pageflags, + int base, int barmax) +{ + int current_page_index = -1, pc, step = 1, nextupdate = 0, i; + int result; + struct suspend_module_ops *first_filter = suspend_get_next_filter(NULL); + + current_page_index = get_next_bit_on(*pageflags, -1); + + pc = finish_at / 5; + + /* Read the pages */ + for (i=0; i< finish_at; i++) { + struct page *page = pfn_to_page(current_page_index); + + /* Status */ + if ((i+base) >= nextupdate) + nextupdate = suspend_update_status(i+base, barmax, + " %d/%d MB ", MB(base+i+1), MB(barmax)); + + if ((i + 1) == pc) { + printk("%d%%...", 20 * step); + step++; + pc = finish_at * step / 5; + } + + if (write) + result = first_filter->write_chunk(page); + else + result = first_filter->read_chunk(page, SUSPEND_ASYNC); + + if (result) { + if (write) { + printk("Write chunk returned %d.\n", result); + abort_suspend("Failed to write a chunk of the " + "image."); + return result; + } else + panic("Failed to read chunk %d/%d of the image. (%d)", + i, finish_at, result); + } + + /* Interactivity*/ + suspend_cond_pause(0, NULL); + + if (test_result_state(SUSPEND_ABORTED) && write) + return 1; + + /* Prepare next */ + current_page_index = get_next_bit_on(*pageflags, + current_page_index); + } + + printk("done.\n"); + + suspend_update_status(base + finish_at, barmax, " %d/%d MB ", + MB(base + finish_at), MB(barmax)); + return 0; +} + -- Nigel Cunningham nigel at suspend2 dot net - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |