On Mon, May 12, 2014 at 12:38:20PM -0400, Dan Streetman wrote: > Originally get_swap_page() started iterating through the singly-linked > list of swap_info_structs using swap_list.next or highest_priority_index, > which both were intended to point to the highest priority active swap > target that was not full. The first patch in this series changed the > singly-linked list to a doubly-linked list, and removed the logic to start > at the highest priority non-full entry; it starts scanning at the highest > priority entry each time, even if the entry is full. > > Replace the manually ordered swap_list_head with a plist, swap_active_head. > Add a new plist, swap_avail_head. The original swap_active_head plist > contains all active swap_info_structs, as before, while the new > swap_avail_head plist contains only swap_info_structs that are active and > available, i.e. not full. Add a new spinlock, swap_avail_lock, to protect > the swap_avail_head list. > > Mel Gorman suggested using plists since they internally handle ordering > the list entries based on priority, which is exactly what swap was doing > manually. All the ordering code is now removed, and swap_info_struct > entries and simply added to their corresponding plist and automatically > ordered correctly. > > Using a new plist for available swap_info_structs simplifies and > optimizes get_swap_page(), which no longer has to iterate over full > swap_info_structs. Using a new spinlock for swap_avail_head plist > allows each swap_info_struct to add or remove themselves from the > plist when they become full or not-full; previously they could not > do so because the swap_info_struct->lock is held when they change > from full<->not-full, and the swap_lock protecting the main > swap_active_head must be ordered before any swap_info_struct->lock. > > Signed-off-by: Dan Streetman <ddstreet@xxxxxxxx> > Cc: Mel Gorman <mgorman@xxxxxxx> > Cc: Shaohua Li <shli@xxxxxxxxxxxx> > Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> > Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Acked-by: Mel Gorman <mgorman@xxxxxxx> -- Mel Gorman SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>