Skip to contentSkip to conversation

Writing to the swap space

DISCUSSION Pavel Machek 2 participants 2 messages May 6, 2002

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hi!

For swsusp, I need to write to the swap space.

I used technique similar to this:

static void mark_swapfiles(swp_entry_t prev, int mode)

{
        swp_entry_t entry;
        union diskpage *cur;

        cur = (union diskpage *)get_free_page(GFP_ATOMIC);
        if (!cur)
                panic("Out of memory in mark_swapfiles");
        /* XXX: this is dirty hack to get first page of swap file */
        entry = SWP_ENTRY(root_swap, 0);
        lock_page(virt_to_page((unsigned long)cur));
        rw_swap_page_nolock(READ, entry, (char *) cur);

... modify cur->fields...

        lock_page(virt_to_page((unsigned long)cur));
        rw_swap_page_nolock(WRITE, entry, (char *)cur);

        free_page((unsigned long)cur);
}

It seems not to work any more. Some io is done, but it is not synchronous any more, and it does not seem to hit the disk.

What am I doing wrong, or is there something wrong in 2.5.12/2.5.13?
Pavel

Signature · 2 lines
(about SSSCA) "I don't say this lightly.  However, I really think that the U.S.
no longer is classifiable as a democracy, but rather as a plutocracy." --hpa
#1 lore raw
Quoted 5 lines · Pavel Machek

Hi!

For swsusp, I need to write to the swap space.

Ah. That's some left-over code. Reads will be OK, but writes will be unexpectedly asynchronous. Nothing in the kernel uses that function for writes so it didn't show up.

mm/page_io.c +1 -4
@@ -117,9 +117,6 @@ void rw_swap_page_nolock(int rw, swp_ent
 	page->mapping = &swapper_space;
 	if (!rw_swap_page_base(rw, entry, page))
 		unlock_page(page);
-	if (rw == WRITE)
-		wait_on_page_writeback(page);
-	else
-		wait_on_page_locked(page);
+	wait_on_page_locked(page);
 	page->mapping = NULL;
 }

-