[PATCH] swsusp: write speedup

Switch the swsusp writeout code from 4k-at-a-time to 4MB-at-a-time.

Crufty old PIII testbox:
	12.9 MB/s -> 20.9 MB/s

Sony Vaio:
	14.7 MB/s -> 26.5 MB/s

The implementation is crude.  A better one would use larger BIOs, but wouldn't
gain any performance.

The memcpys will be mostly pipelined with the IO and basically come for free.

The ENOMEM path has not been tested.  It should be.

Cc: Pavel Machek <pavel@ucw.cz>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Andrew Morton
2006-09-25 23:32:42 -07:00
committed by Linus Torvalds
parent 3a4f7577c9
commit ab95416035
3 changed files with 97 additions and 24 deletions

View File

@@ -156,10 +156,12 @@ out:
* We use end_swap_bio_read() even for writes, because it happens to do what
* we want.
*/
int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page)
int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page,
struct bio **bio_chain)
{
struct bio *bio;
int ret = 0;
int bio_rw;
lock_page(page);
@@ -170,11 +172,22 @@ int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page)
goto out;
}
submit_bio(rw | (1 << BIO_RW_SYNC), bio);
wait_on_page_locked(page);
bio_rw = rw;
if (!bio_chain)
bio_rw |= (1 << BIO_RW_SYNC);
if (bio_chain)
bio_get(bio);
submit_bio(bio_rw, bio);
if (bio_chain == NULL) {
wait_on_page_locked(page);
if (!PageUptodate(page) || PageError(page))
ret = -EIO;
if (!PageUptodate(page) || PageError(page))
ret = -EIO;
}
if (bio_chain) {
bio->bi_private = *bio_chain;
*bio_chain = bio;
}
out:
return ret;
}