When NetBSD and FreeBSD swap out a page from a process, they look in the process virtual address space to find nearby pages that are also candidates for being swapped out. This greatly increases the chance of swapin IO pulling in related data, reducing the number of disk seeks involved in swap IO.
The FreeBSD code that implements swapout clustering is in vm/vm_pageout.c. On Linux it will need to be slightly different due to the fact that Linux does not have BSD style VM objects.
Interested in implementing this feature? Go to #mm on irc.oftc.net or claim the feature on the KernelProjects page.
An example patch that clusters virtually-related, inactive anonymous pages on LRU isolation time, without taking page table references into account, can be found here.
A swapin readahead implementation that takes both VMA-relationship and physical swap layout into account when looking for candidates can be found here.