• Immutable Page
  • Info
  • Attachments


Under Construction

add_to_swap(), step by step

  • lives at mm/swap_state.c line 163

  • 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.

Line numbers are current as of December 2013, in Linus' tree.

Tell others about this page:

last edited 2013-12-30 22:08:51 by KelleyNielsen