From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Jiri Slaby <jirislaby@gmail.com>
Cc: linux-pm@lists.linux-foundation.org,
Nigel Cunningham <ncunningham@crca.org.au>
Subject: Re: [RFC 09/15] PM / Hibernate: user, implement user_ops writer
Date: Tue, 30 Mar 2010 00:09:18 +0200 [thread overview]
Message-ID: <201003300009.18315.rjw@sisk.pl> (raw)
In-Reply-To: <4BB0C840.7030802@gmail.com>
On Monday 29 March 2010, Jiri Slaby wrote:
> On 03/26/2010 11:04 PM, Rafael J. Wysocki wrote:
> > I have some other comments to this patch, but I'd like to understand what
> > really happens here, since the changelog is not too verbose.
> >
> > Please explain the design here.
>
> Yeah, my bad.
>
> What I want to achieve is to revert the behaviour of current
> implementation to the one used in toi. Now, it is that when writing a
> page to the swap, the hibernation does snapshot_read_page(page) with
> swap_write_page(page) in a loop. This is OK until one needs to do
> anything with the page.
>
> When compression or encryption (or both) are needed to be done, this
> scenario does not work well because page returned by snapshot_read_page,
> after going through the crypto layers, is no longer PAGE_SIZE big.
Actually, s2disk has the same problem, because it only receives entire pages
from the kernel and it needs to compress/encrypt them before writing to the
storage (which also is written in blocks that are page size-aligned). Still,
s2disk uses snapshot_[read\write]_next() through the functions in user.c, so
I don't think we need to reorder things in there.
> Probably the easiest solution is to revert it as noted above: a page is
> taken from snapshot (with patches I have here the snapshot layer is only
> told to "store next page" without returning a page to the caller), fed
> through crypto layers as needed and finally given to chunk writer which
> assembles PAGE_SIZE blocks from the chunks. Then whole pages of
> compressed/encrypted data are given to user or in-kernel block io by
> hibernate_io_ops->write_page. In-kernel .write_page simply calls
> swap_write_page (which in turn hib_bio_write_page while storing swap
> sector entries).
That's fine if I understand correctly.
> User .write_page, with buf as a parameter, does the following:
> * to_do_buf = buf
> * set WORK bit
> * wake_up .read (below)
> * wait_for WORK bit clear
>
> Writer in this case is a user process performing fops->read. .read does
> the following:
> * wait_for WORK bit
> * copy_to_user to_do_buf
> * clear WORK bit
> * wake_up .write_page
>
> I need the barrier to ensure the "to_do_buf = buf" assignment is not
> reordered with the "set WORK bit" in .write_page. Otherwise .read will
> see WORK bit set, but have to_do_buf not updated. I certainly can lock
> the two operation together, but (a) I see no point in doing so; (b) it
> makes the code worse (I need to unlock and relock in wait_event and
> unlock on all fail paths).
>
> The very similar happens for fops->write, ergo hibernate_io_ops->read_page.
You can't open /dev/snapshot for reading and writing at the same time, because
that wouldn't make any sense.
/dev/snapshot represents a hibernation image which is presented to user space
as a "file", because the user space is then able to use "regular" read() and
write() on it. However, the situation during hibernation is much different
than during resume. Namely, during hibernation the image is there in memory
and it can't be modified. It can only be read and written to the storage. So,
at this stage it only makes sense to open /dev/snapshot for reading.
Now, during resume the image is not present in memory at all. In fact, we
don't even use any contiguous region to store the pages read from the on-disk
image. Instead, the pages are put directly into their destination page frames,
if they are free. Otherwise, they are put into free page frames and then
copied back to the target ones right before returning control to the image
kernel. So during resume there's nothing that could be read from /dev/snapshot
and you can only open it for writing.
The idea is that snapshot_read_next() will only be used during hibernation
for reading all of the image pages as contiguous stream of data (the real image
is not contiguous in general), because that's what the user space needs. Then,
the observation goes that the swap.c functions can use the same mechanism,
although that is not really necessary in principle.
Analogously, snapshot_write_next() is only useful during resume for writing
all of the image pages as a contiguous stream of data, because that's needed
by the user space and _can_ be used by the in-kernel code as well.
[Note that snapshot_[read|write]_next() belong to the memory management
part of the hibernation subsystem and that's exactly why they are in
snapshot.c.]
Now, compression can happen in two places: while the image is created
or after it has been created (current behavior). In the latter case, the image
pages need not be compressed in place, they may be compressed after being
returned by snapshot_read_next(), in a temporary buffer (that's now s2disk
does that). So you can arrange things like this:
create image
repeat:
- snapshot_read_next() -> buffer
- if buffer is full, compress it (possibly encrypt it) and write the result to
the storage
This way you'd just avoid all of the complications and I fail to see any
drawbacks.
Now, an attractive thing would be to compress data while creating the image
and that may be done in the following way:
have a buffer ready
repeat:
- copy image pages to the buffer (instead of copying them directly into the
image storage space)
- if buffer is full, compress it and copy the result to the image storage
space, page by page.
Thanks,
Rafael
next prev parent reply other threads:[~2010-03-29 22:09 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-23 16:17 [RFC 01/15] FS: libfs, implement simple_write_to_buffer Jiri Slaby
2010-03-23 16:17 ` [RFC 02/15] PM / Hibernate: snapshot cleanup Jiri Slaby
2010-03-23 16:17 ` [RFC 03/15] PM / Hibernate: separate block_io Jiri Slaby
2010-03-23 16:17 ` [RFC 04/15] PM / Hibernate: move the first_sector out of swsusp_write Jiri Slaby
2010-03-23 16:17 ` [RFC 05/15] PM / Hibernate: group swap ops Jiri Slaby
2010-03-23 16:17 ` [RFC 06/15] PM / Hibernate: swap, remove swap_map_handle usages Jiri Slaby
2010-03-23 16:17 ` [RFC 07/15] PM / Hibernate: add sws_modules_ops Jiri Slaby
2010-03-23 16:17 ` [RFC 08/15] PM / Hibernate: add user module_ops Jiri Slaby
2010-03-25 22:07 ` Rafael J. Wysocki
[not found] ` <201003252307.15232.rjw@sisk.pl>
2010-03-26 9:43 ` Jiri Slaby
2010-03-23 16:17 ` [RFC 09/15] PM / Hibernate: user, implement user_ops writer Jiri Slaby
2010-03-23 16:17 ` [RFC 10/15] PM / Hibernate: user, implement user_ops reader Jiri Slaby
2010-03-23 16:17 ` [RFC 11/15] PM / Hibernate: add chunk i/o support Jiri Slaby
2010-03-23 16:17 ` [RFC 12/15] PM / Hibernate: split snapshot_read_next Jiri Slaby
2010-03-23 16:17 ` [RFC 13/15] PM / Hibernate: split snapshot_write_next Jiri Slaby
2010-03-23 16:17 ` [RFC 14/15] PM / Hibernate: dealign swsusp_info Jiri Slaby
2010-03-23 16:17 ` [RFC 15/15] PM / Hibernate: move non-swap code to snapshot.c Jiri Slaby
2010-03-23 21:51 ` [RFC 01/15] FS: libfs, implement simple_write_to_buffer Rafael J. Wysocki
2010-03-23 22:09 ` Nigel Cunningham
[not found] ` <1269361063-3341-3-git-send-email-jslaby@suse.cz>
2010-03-24 20:30 ` [RFC 03/15] PM / Hibernate: separate block_io Pavel Machek
[not found] ` <20100324203021.GE5798@elf.ucw.cz>
2010-03-24 21:22 ` Jiri Slaby
[not found] ` <4BAA829F.7060207@gmail.com>
2010-03-24 22:58 ` Nigel Cunningham
[not found] ` <4BAA98FC.9040302@crca.org.au>
2010-03-25 2:35 ` Nigel Cunningham
2010-03-25 14:29 ` Pavel Machek
[not found] ` <4BAACC0A.2040009@crca.org.au>
2010-03-25 20:12 ` Rafael J. Wysocki
[not found] ` <201003252112.25204.rjw@sisk.pl>
2010-03-25 20:13 ` Nigel Cunningham
[not found] ` <4BABC3D1.1050104@crca.org.au>
2010-03-25 20:33 ` Rafael J. Wysocki
[not found] ` <201003252133.50206.rjw@sisk.pl>
2010-03-25 20:36 ` Nigel Cunningham
2010-03-29 13:30 ` Pavel Machek
[not found] ` <1269361063-3341-4-git-send-email-jslaby@suse.cz>
2010-03-24 20:31 ` [RFC 04/15] PM / Hibernate: move the first_sector out of swsusp_write Pavel Machek
[not found] ` <20100324203125.GF5798@elf.ucw.cz>
2010-03-25 21:26 ` Rafael J. Wysocki
[not found] ` <1269361063-3341-6-git-send-email-jslaby@suse.cz>
2010-03-24 20:33 ` [RFC 06/15] PM / Hibernate: swap, remove swap_map_handle usages Pavel Machek
[not found] ` <20100324203329.GG5798@elf.ucw.cz>
2010-03-24 21:29 ` Jiri Slaby
[not found] ` <4BAA842A.6060906@gmail.com>
2010-03-25 21:35 ` Rafael J. Wysocki
[not found] ` <1269361063-3341-9-git-send-email-jslaby@suse.cz>
2010-03-24 20:42 ` [RFC 09/15] PM / Hibernate: user, implement user_ops writer Pavel Machek
[not found] ` <20100324204259.GA6423@elf.ucw.cz>
2010-03-24 21:40 ` Jiri Slaby
[not found] ` <4BAA86E8.5090108@gmail.com>
2010-03-25 21:36 ` Pavel Machek
2010-03-25 22:14 ` Rafael J. Wysocki
[not found] ` <201003252314.33256.rjw@sisk.pl>
2010-03-26 9:34 ` Jiri Slaby
[not found] ` <4BAC7FC3.50405@gmail.com>
2010-03-26 22:04 ` Rafael J. Wysocki
2010-03-27 7:02 ` Pavel Machek
[not found] ` <201003262304.32118.rjw@sisk.pl>
2010-03-29 15:33 ` Jiri Slaby
[not found] ` <4BB0C840.7030802@gmail.com>
2010-03-29 22:09 ` Rafael J. Wysocki [this message]
2010-03-30 1:14 ` Nigel Cunningham
2010-03-30 21:03 ` Rafael J. Wysocki
2010-03-31 2:31 ` Nigel Cunningham
2010-03-31 14:47 ` Pavel Machek
2010-03-31 21:01 ` Nigel Cunningham
2010-03-31 20:25 ` Rafael J. Wysocki
2010-03-31 21:06 ` Nigel Cunningham
2010-03-31 21:36 ` Rafael J. Wysocki
2010-04-04 23:08 ` Nigel Cunningham
2010-04-04 23:13 ` Rafael J. Wysocki
2010-03-31 21:54 ` Nigel Cunningham
2010-03-30 8:59 ` Jiri Slaby
2010-03-30 20:50 ` Rafael J. Wysocki
2010-03-31 14:41 ` Jiri Slaby
2010-03-31 20:29 ` Rafael J. Wysocki
2010-04-21 21:22 ` Jiri Slaby
2010-04-22 3:43 ` Rafael J. Wysocki
2010-03-24 22:13 ` [RFC 01/15] FS: libfs, implement simple_write_to_buffer Rafael J. Wysocki
[not found] ` <1269361063-3341-2-git-send-email-jslaby@suse.cz>
2010-03-24 20:29 ` [RFC 02/15] PM / Hibernate: snapshot cleanup Pavel Machek
2010-03-24 22:35 ` Rafael J. Wysocki
2010-03-25 5:29 ` Pavel Machek
[not found] ` <1269361063-3341-10-git-send-email-jslaby@suse.cz>
2010-03-25 5:30 ` what the patches do Re: [RFC 10/15] PM / Hibernate: user, implement user_ops reader Pavel Machek
[not found] ` <20100325053003.GB12935@elf.ucw.cz>
2010-03-25 5:42 ` Nigel Cunningham
[not found] ` <4BAAF7DA.30506@crca.org.au>
2010-03-25 6:12 ` Nigel Cunningham
2010-03-25 20:14 ` Rafael J. Wysocki
[not found] ` <201003252114.36605.rjw@sisk.pl>
2010-03-25 20:21 ` Nigel Cunningham
[not found] ` <4BABC5B6.2070301@crca.org.au>
2010-03-25 20:29 ` Rafael J. Wysocki
[not found] ` <201003252129.10224.rjw@sisk.pl>
2010-03-25 20:35 ` Nigel Cunningham
[not found] ` <4BABC926.8060203@crca.org.au>
2010-03-25 21:13 ` Rafael J. Wysocki
2010-03-25 21:26 ` Pavel Machek
[not found] ` <20100325212656.GD22902@elf.ucw.cz>
2010-03-25 21:49 ` Nigel Cunningham
[not found] ` <4BABDA59.8070107@crca.org.au>
2010-04-02 6:36 ` Pavel Machek
[not found] ` <20100402063644.GA14941@atrey.karlin.mff.cuni.cz>
2010-04-02 17:03 ` Rafael J. Wysocki
2010-03-25 22:21 ` Rafael J. Wysocki
[not found] ` <1269361063-3341-5-git-send-email-jslaby@suse.cz>
2010-03-25 21:28 ` [RFC 05/15] PM / Hibernate: group swap ops Rafael J. Wysocki
[not found] ` <1269361063-3341-7-git-send-email-jslaby@suse.cz>
2010-03-24 20:36 ` [RFC 07/15] PM / Hibernate: add sws_modules_ops Pavel Machek
[not found] ` <20100324203634.GH5798@elf.ucw.cz>
2010-03-24 21:31 ` Jiri Slaby
2010-03-25 22:02 ` Rafael J. Wysocki
[not found] ` <1269361063-3341-11-git-send-email-jslaby@suse.cz>
2010-03-25 22:38 ` [RFC 11/15] PM / Hibernate: add chunk i/o support Rafael J. Wysocki
[not found] ` <201003252338.48513.rjw@sisk.pl>
2010-03-26 9:09 ` Jiri Slaby
[not found] ` <4BAC79B4.4040200@gmail.com>
2010-03-26 10:02 ` Nigel Cunningham
[not found] ` <1269361063-3341-12-git-send-email-jslaby@suse.cz>
2010-03-25 22:44 ` [RFC 12/15] PM / Hibernate: split snapshot_read_next Rafael J. Wysocki
[not found] ` <1269361063-3341-13-git-send-email-jslaby@suse.cz>
2010-03-25 22:46 ` [RFC 13/15] PM / Hibernate: split snapshot_write_next Rafael J. Wysocki
[not found] ` <1269361063-3341-14-git-send-email-jslaby@suse.cz>
2010-03-25 22:46 ` [RFC 14/15] PM / Hibernate: dealign swsusp_info Rafael J. Wysocki
[not found] ` <1269361063-3341-15-git-send-email-jslaby@suse.cz>
2010-03-25 22:50 ` [RFC 15/15] PM / Hibernate: move non-swap code to snapshot.c Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201003300009.18315.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=jirislaby@gmail.com \
--cc=linux-pm@lists.linux-foundation.org \
--cc=ncunningham@crca.org.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox