1*151f4e2bSMauro Carvalho Chehab===============================================
2*151f4e2bSMauro Carvalho ChehabUsing swap files with software suspend (swsusp)
3*151f4e2bSMauro Carvalho Chehab===============================================
4*151f4e2bSMauro Carvalho Chehab
5*151f4e2bSMauro Carvalho Chehab	(C) 2006 Rafael J. Wysocki <rjw@sisk.pl>
6*151f4e2bSMauro Carvalho Chehab
7*151f4e2bSMauro Carvalho ChehabThe Linux kernel handles swap files almost in the same way as it handles swap
8*151f4e2bSMauro Carvalho Chehabpartitions and there are only two differences between these two types of swap
9*151f4e2bSMauro Carvalho Chehabareas:
10*151f4e2bSMauro Carvalho Chehab(1) swap files need not be contiguous,
11*151f4e2bSMauro Carvalho Chehab(2) the header of a swap file is not in the first block of the partition that
12*151f4e2bSMauro Carvalho Chehabholds it.  From the swsusp's point of view (1) is not a problem, because it is
13*151f4e2bSMauro Carvalho Chehabalready taken care of by the swap-handling code, but (2) has to be taken into
14*151f4e2bSMauro Carvalho Chehabconsideration.
15*151f4e2bSMauro Carvalho Chehab
16*151f4e2bSMauro Carvalho ChehabIn principle the location of a swap file's header may be determined with the
17*151f4e2bSMauro Carvalho Chehabhelp of appropriate filesystem driver.  Unfortunately, however, it requires the
18*151f4e2bSMauro Carvalho Chehabfilesystem holding the swap file to be mounted, and if this filesystem is
19*151f4e2bSMauro Carvalho Chehabjournaled, it cannot be mounted during resume from disk.  For this reason to
20*151f4e2bSMauro Carvalho Chehabidentify a swap file swsusp uses the name of the partition that holds the file
21*151f4e2bSMauro Carvalho Chehaband the offset from the beginning of the partition at which the swap file's
22*151f4e2bSMauro Carvalho Chehabheader is located.  For convenience, this offset is expressed in <PAGE_SIZE>
23*151f4e2bSMauro Carvalho Chehabunits.
24*151f4e2bSMauro Carvalho Chehab
25*151f4e2bSMauro Carvalho ChehabIn order to use a swap file with swsusp, you need to:
26*151f4e2bSMauro Carvalho Chehab
27*151f4e2bSMauro Carvalho Chehab1) Create the swap file and make it active, eg.::
28*151f4e2bSMauro Carvalho Chehab
29*151f4e2bSMauro Carvalho Chehab    # dd if=/dev/zero of=<swap_file_path> bs=1024 count=<swap_file_size_in_k>
30*151f4e2bSMauro Carvalho Chehab    # mkswap <swap_file_path>
31*151f4e2bSMauro Carvalho Chehab    # swapon <swap_file_path>
32*151f4e2bSMauro Carvalho Chehab
33*151f4e2bSMauro Carvalho Chehab2) Use an application that will bmap the swap file with the help of the
34*151f4e2bSMauro Carvalho ChehabFIBMAP ioctl and determine the location of the file's swap header, as the
35*151f4e2bSMauro Carvalho Chehaboffset, in <PAGE_SIZE> units, from the beginning of the partition which
36*151f4e2bSMauro Carvalho Chehabholds the swap file.
37*151f4e2bSMauro Carvalho Chehab
38*151f4e2bSMauro Carvalho Chehab3) Add the following parameters to the kernel command line::
39*151f4e2bSMauro Carvalho Chehab
40*151f4e2bSMauro Carvalho Chehab    resume=<swap_file_partition> resume_offset=<swap_file_offset>
41*151f4e2bSMauro Carvalho Chehab
42*151f4e2bSMauro Carvalho Chehabwhere <swap_file_partition> is the partition on which the swap file is located
43*151f4e2bSMauro Carvalho Chehaband <swap_file_offset> is the offset of the swap header determined by the
44*151f4e2bSMauro Carvalho Chehabapplication in 2) (of course, this step may be carried out automatically
45*151f4e2bSMauro Carvalho Chehabby the same application that determines the swap file's header offset using the
46*151f4e2bSMauro Carvalho ChehabFIBMAP ioctl)
47*151f4e2bSMauro Carvalho Chehab
48*151f4e2bSMauro Carvalho ChehabOR
49*151f4e2bSMauro Carvalho Chehab
50*151f4e2bSMauro Carvalho ChehabUse a userland suspend application that will set the partition and offset
51*151f4e2bSMauro Carvalho Chehabwith the help of the SNAPSHOT_SET_SWAP_AREA ioctl described in
52*151f4e2bSMauro Carvalho ChehabDocumentation/power/userland-swsusp.rst (this is the only method to suspend
53*151f4e2bSMauro Carvalho Chehabto a swap file allowing the resume to be initiated from an initrd or initramfs
54*151f4e2bSMauro Carvalho Chehabimage).
55*151f4e2bSMauro Carvalho Chehab
56*151f4e2bSMauro Carvalho ChehabNow, swsusp will use the swap file in the same way in which it would use a swap
57*151f4e2bSMauro Carvalho Chehabpartition.  In particular, the swap file has to be active (ie. be present in
58*151f4e2bSMauro Carvalho Chehab/proc/swaps) so that it can be used for suspending.
59*151f4e2bSMauro Carvalho Chehab
60*151f4e2bSMauro Carvalho ChehabNote that if the swap file used for suspending is deleted and recreated,
61*151f4e2bSMauro Carvalho Chehabthe location of its header need not be the same as before.  Thus every time
62*151f4e2bSMauro Carvalho Chehabthis happens the value of the "resume_offset=" kernel command line parameter
63*151f4e2bSMauro Carvalho Chehabhas to be updated.
64