virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Amit Shah <amit.shah@redhat.com>
Cc: linux-kernel@vger.kernel.org, levinsasha928@gmail.com,
	Virtualization List <virtualization@lists.linux-foundation.org>
Subject: Re: [PATCH v3 04/11] virtio: console: Add freeze and restore handlers to support S4
Date: Thu, 17 Nov 2011 14:30:48 +0200	[thread overview]
Message-ID: <20111117123047.GD19682@redhat.com> (raw)
In-Reply-To: <44ccf96a9f34b7b9a838af00b2abc97796cbdfe5.1321530505.git.amit.shah@redhat.com>

On Thu, Nov 17, 2011 at 05:27:35PM +0530, Amit Shah wrote:
> Remove all vqs and associated buffers in the freeze callback which
> prepares us to go into hibernation state.  On restore, re-create all the
> vqs and populate the input vqs with buffers to get to the pre-hibernate
> state.
> 
> Note: Any outstanding unconsumed buffers are discarded; which means
> there's a possibility of data loss in case the host or the guest didn't
> consume any data already present in the vqs.  This can be addressed in a
> later patch series, perhaps in virtio common code.
> 
> Signed-off-by: Amit Shah <amit.shah@redhat.com>
> ---
>  drivers/char/virtio_console.c |   58 +++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 58 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
> index e14f5aa..fd2fd6f 100644
> --- a/drivers/char/virtio_console.c
> +++ b/drivers/char/virtio_console.c
> @@ -1844,6 +1844,60 @@ static unsigned int features[] = {
>  	VIRTIO_CONSOLE_F_MULTIPORT,
>  };
>  
> +#ifdef CONFIG_PM
> +static int virtcons_freeze(struct virtio_device *vdev)
> +{
> +	struct ports_device *portdev;
> +	struct port *port;
> +
> +	portdev = vdev->priv;
> +
> +	vdev->config->reset(vdev);

This does a reset but that's not a guarantee that
interrupt is not running on another CPU.

> +
> +	cancel_work_sync(&portdev->control_work);

And then work can get scheduled after this point.

> +	remove_controlq_data(portdev);

And after this point this will lead to a use after free.

> +
> +	list_for_each_entry(port, &portdev->ports, list) {
> +		/*
> +		 * We'll ask the host later if the new invocation has
> +		 * the port opened or closed.
> +		 */
> +		port->host_connected = false;
> +		remove_port_data(port);
> +	}
> +	remove_vqs(portdev);
> +
> +	return 0;
> +}
> +
> +static int virtcons_restore(struct virtio_device *vdev)
> +{
> +	struct ports_device *portdev;
> +	struct port *port;
> +	int ret;
> +
> +	portdev = vdev->priv;
> +
> +	ret = init_vqs(portdev);
> +	if (ret)
> +		return ret;
> +
> +	if (use_multiport(portdev))
> +		fill_queue(portdev->c_ivq, &portdev->cvq_lock);
> +
> +	list_for_each_entry(port, &portdev->ports, list) {
> +		port->in_vq = portdev->in_vqs[port->id];
> +		port->out_vq = portdev->out_vqs[port->id];
> +
> +		fill_queue(port->in_vq, &port->inbuf_lock);
> +
> +		/* Get port open/close status on the host */
> +		send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1);
> +	}
> +	return 0;
> +}
> +#endif
> +
>  static struct virtio_driver virtio_console = {
>  	.feature_table = features,
>  	.feature_table_size = ARRAY_SIZE(features),
> @@ -1853,6 +1907,10 @@ static struct virtio_driver virtio_console = {
>  	.probe =	virtcons_probe,
>  	.remove =	virtcons_remove,
>  	.config_changed = config_intr,
> +#ifdef CONFIG_PM
> +	.freeze =	virtcons_freeze,
> +	.restore =	virtcons_restore,
> +#endif
>  };
>  
>  static int __init init(void)
> -- 
> 1.7.7.1

  reply	other threads:[~2011-11-17 12:30 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-17 11:57 [PATCH v3 00/11] virtio: S4 support Amit Shah
2011-11-17 11:57 ` [PATCH v3 01/11] virtio: pci: switch to new PM API Amit Shah
2011-11-17 11:57 ` [PATCH v3 02/11] virtio: pci: add PM notification handlers for restore, freeze, thaw, poweroff Amit Shah
2011-11-17 11:57 ` [PATCH v3 03/11] virtio: console: Move out vq and vq buf removal into separate functions Amit Shah
2011-11-17 11:57 ` [PATCH v3 04/11] virtio: console: Add freeze and restore handlers to support S4 Amit Shah
2011-11-17 12:30   ` Michael S. Tsirkin [this message]
2011-11-17 11:57 ` [PATCH v3 05/11] virtio: blk: Move out vq initialization to separate function Amit Shah
2011-11-17 11:57 ` [PATCH v3 06/11] virtio: blk: Add freeze, restore handlers to support S4 Amit Shah
2011-11-17 11:57 ` [PATCH v3 07/11] virtio: net: Move out vq initialization into separate function Amit Shah
2011-11-17 11:57 ` [PATCH v3 08/11] virtio: net: Move out vq and vq buf removal " Amit Shah
2011-11-17 11:57 ` [PATCH v3 09/11] virtio: net: Add freeze, restore handlers to support S4 Amit Shah
2011-11-17 12:19   ` Michael S. Tsirkin
2011-11-17 12:27     ` Amit Shah
2011-11-17 12:33       ` Michael S. Tsirkin
2011-11-17 11:57 ` [PATCH v3 10/11] virtio: balloon: Move out vq initialization into separate function Amit Shah
2011-11-17 11:57 ` [PATCH v3 11/11] virtio: balloon: Add freeze, restore handlers to support S4 Amit Shah
2011-11-17 12:25   ` Michael S. Tsirkin
2011-11-17 12:29     ` Amit Shah
2011-11-17 12:36       ` Michael S. Tsirkin
2011-11-17 13:03       ` Michael S. Tsirkin
     [not found] ` <81e98fc00370152ded2eef20f0953f19fad6f0f5.1321530505.git.amit.shah@redhat.com>
2011-11-17 12:28   ` [PATCH v3 06/11] virtio: blk: " Michael S. Tsirkin

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=20111117123047.GD19682@redhat.com \
    --to=mst@redhat.com \
    --cc=amit.shah@redhat.com \
    --cc=levinsasha928@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=virtualization@lists.linux-foundation.org \
    /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;
as well as URLs for NNTP newsgroup(s).