From: Linus Benedict Torvalds (torvalds@klaava.Helsinki.FI)
Date: 09/01/92


From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Subject: Re: Swap files (was: Re: .97 kernel and root disk/probs with swapping)
Date: 1 Sep 1992 08:31:54 GMT

In article <bjl.715328078@freyr> B.J.Lippolt@research.ptt.nl writes:
>
>On the subject of swapping.
>
>Would it be possible to implement a scheme (a la SunOS) where you can
>'add' swap files to the swap space? E.g. I have a 8Mb swap partition, and
>when I need more (which happens once in a while) I just create a swap
>file and add it to my 8 Mb swap space. Would this be a minor (i.e. I
>can do it myself) or a major change?

It wouldn't be too hard: right now swap-map numbers are 31-bit entities,
and it would be pretty easy to use the high 7 bits to be indexes to the
swap-file, while keeping the low 24 bits as the page-in-swapfile index.
The changes would be pretty minimal, although it would need a thorough
understanding of the swapping setup. It's an interesting thought: I
might implement it myself some time when I have nothing better to do.

Anyway - if you are interested to implement it yourself, the thing to do
is roughly:

 - change all the swap-file related variables to be arrays, and add a
   "nr_swapfiles" variable that keeps count of how many are in use. The
   variables are rougly:
        swap_bitmap, swap_lockmap, swap_device, swap_file
   as well as some optimization values (lowest_bit, highest_bit) used so
   that the routines wouldn't have to go through the full bitmap all the
   time.

   It would look a bit like this:

        struct swap_info {
                struct inode * swap_file;
                int swap_device;
                char * swap_bitmap;
                char * swap_lockmap;
                int lowest_bit, int highest_bit;
        } swap_info[MAX_SWAPFILES];

        int nr_swapfiles = 0;

 - change the "get_swap_page()", "rw_swap_page()" and "swap_free()"
   functions to understand the high bits of the swap block-nr, and
   naturally the sys_swapon() system call to enable it all.

The changes shouldn't actually be more than a couple of lines in each
place, and it shouldn't be more than a couple of hours work - assuming
you understand the code.

On the other hand, I've been looking into a "sys_swapoff()" system call
(which needs a bit more thought: you have to make sure the swapfile
isn't used by anything), and I might implement the aboev at the same
time. No promises.

                Linus