Navigation

Under Construction

add_to_swap(), step by step

Receives two parameters: a struct page, which is the page to be swapped out; and a struct list_head, which is used only for the huge page case

Has two local variables: a swap_entry_t (which is a bitfield, so all "members" are extracted via macros), and an int to collect the returned error code from add_to_swap_cache().

Begins by asserting two conditions: that the page has been locked by the caller, and is up to date. It asserts with the BUG_ON macro, which invokes a kernel panic if the condition fails.

Allocates swap space for the page by calling get_swap_page(), which lives at swapfile.c line 640. Stores the handle to it in the local swap_entry_t.

handles the huge page case (which is beyond the scope of this article).

Inserts the swap entry into the kernel's swap management system by calling add_to_swap_cache(), which lives at swap_state.c line 121.

Marks the page as dirty, so that a kernel pdflush thread will do the actual write to disk, and exits returning 1 if it was successfully added to swap. Otherwise, if add_to_swap_cache returned an error code for an -ENOMEM allocation failure, cleans up by calling swapcache_free and exits returning 0.