1151f4e2bSMauro Carvalho Chehab===============================================
2151f4e2bSMauro Carvalho ChehabUsing swap files with software suspend (swsusp)
3151f4e2bSMauro Carvalho Chehab===============================================
4151f4e2bSMauro Carvalho Chehab
5151f4e2bSMauro Carvalho Chehab	(C) 2006 Rafael J. Wysocki <rjw@sisk.pl>
6151f4e2bSMauro Carvalho Chehab
7151f4e2bSMauro Carvalho ChehabThe Linux kernel handles swap files almost in the same way as it handles swap
8151f4e2bSMauro Carvalho Chehabpartitions and there are only two differences between these two types of swap
9151f4e2bSMauro Carvalho Chehabareas:
10151f4e2bSMauro Carvalho Chehab(1) swap files need not be contiguous,
11151f4e2bSMauro Carvalho Chehab(2) the header of a swap file is not in the first block of the partition that
12151f4e2bSMauro Carvalho Chehabholds it.  From the swsusp's point of view (1) is not a problem, because it is
13151f4e2bSMauro Carvalho Chehabalready taken care of by the swap-handling code, but (2) has to be taken into
14151f4e2bSMauro Carvalho Chehabconsideration.
15151f4e2bSMauro Carvalho Chehab
16151f4e2bSMauro Carvalho ChehabIn principle the location of a swap file's header may be determined with the
17151f4e2bSMauro Carvalho Chehabhelp of appropriate filesystem driver.  Unfortunately, however, it requires the
18151f4e2bSMauro Carvalho Chehabfilesystem holding the swap file to be mounted, and if this filesystem is
19151f4e2bSMauro Carvalho Chehabjournaled, it cannot be mounted during resume from disk.  For this reason to
20151f4e2bSMauro Carvalho Chehabidentify a swap file swsusp uses the name of the partition that holds the file
21151f4e2bSMauro Carvalho Chehaband the offset from the beginning of the partition at which the swap file's
22151f4e2bSMauro Carvalho Chehabheader is located.  For convenience, this offset is expressed in <PAGE_SIZE>
23151f4e2bSMauro Carvalho Chehabunits.
24151f4e2bSMauro Carvalho Chehab
25151f4e2bSMauro Carvalho ChehabIn order to use a swap file with swsusp, you need to:
26151f4e2bSMauro Carvalho Chehab
27151f4e2bSMauro Carvalho Chehab1) Create the swap file and make it active, eg.::
28151f4e2bSMauro Carvalho Chehab
29151f4e2bSMauro Carvalho Chehab    # dd if=/dev/zero of=<swap_file_path> bs=1024 count=<swap_file_size_in_k>
30151f4e2bSMauro Carvalho Chehab    # mkswap <swap_file_path>
31151f4e2bSMauro Carvalho Chehab    # swapon <swap_file_path>
32151f4e2bSMauro Carvalho Chehab
33151f4e2bSMauro Carvalho Chehab2) Use an application that will bmap the swap file with the help of the
34151f4e2bSMauro Carvalho ChehabFIBMAP ioctl and determine the location of the file's swap header, as the
35151f4e2bSMauro Carvalho Chehaboffset, in <PAGE_SIZE> units, from the beginning of the partition which
36151f4e2bSMauro Carvalho Chehabholds the swap file.
37151f4e2bSMauro Carvalho Chehab
38151f4e2bSMauro Carvalho Chehab3) Add the following parameters to the kernel command line::
39151f4e2bSMauro Carvalho Chehab
40151f4e2bSMauro Carvalho Chehab    resume=<swap_file_partition> resume_offset=<swap_file_offset>
41151f4e2bSMauro Carvalho Chehab
42151f4e2bSMauro Carvalho Chehabwhere <swap_file_partition> is the partition on which the swap file is located
43151f4e2bSMauro Carvalho Chehaband <swap_file_offset> is the offset of the swap header determined by the
44151f4e2bSMauro Carvalho Chehabapplication in 2) (of course, this step may be carried out automatically
45151f4e2bSMauro Carvalho Chehabby the same application that determines the swap file's header offset using the
46151f4e2bSMauro Carvalho ChehabFIBMAP ioctl)
47151f4e2bSMauro Carvalho Chehab
48151f4e2bSMauro Carvalho ChehabOR
49151f4e2bSMauro Carvalho Chehab
50151f4e2bSMauro Carvalho ChehabUse a userland suspend application that will set the partition and offset
51151f4e2bSMauro Carvalho Chehabwith the help of the SNAPSHOT_SET_SWAP_AREA ioctl described in
52151f4e2bSMauro Carvalho ChehabDocumentation/power/userland-swsusp.rst (this is the only method to suspend
53151f4e2bSMauro Carvalho Chehabto a swap file allowing the resume to be initiated from an initrd or initramfs
54151f4e2bSMauro Carvalho Chehabimage).
55151f4e2bSMauro Carvalho Chehab
56151f4e2bSMauro Carvalho ChehabNow, swsusp will use the swap file in the same way in which it would use a swap
57151f4e2bSMauro Carvalho Chehabpartition.  In particular, the swap file has to be active (ie. be present in
58151f4e2bSMauro Carvalho Chehab/proc/swaps) so that it can be used for suspending.
59151f4e2bSMauro Carvalho Chehab
60151f4e2bSMauro Carvalho ChehabNote that if the swap file used for suspending is deleted and recreated,
61151f4e2bSMauro Carvalho Chehabthe location of its header need not be the same as before.  Thus every time
62151f4e2bSMauro Carvalho Chehabthis happens the value of the "resume_offset=" kernel command line parameter
63151f4e2bSMauro Carvalho Chehabhas to be updated.
64