All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cornelia Huck <cohuck@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: "Alex Bennée" <alex.bennee@linaro.org>,
	virtio-dev@lists.oasis-open.org,
	"Zha Bin" <zhabin@linux.alibaba.com>,
	"Jing Liu" <jing2.liu@linux.intel.com>,
	"Chao Peng" <chao.p.peng@linux.intel.com>
Subject: Re: [virtio-dev] On doorbells (queue notifications)
Date: Wed, 15 Jul 2020 19:01:47 +0200	[thread overview]
Message-ID: <20200715190147.05e71272.cohuck@redhat.com> (raw)
In-Reply-To: <20200715154732.GC47883@stefanha-x1.localdomain>

[-- Attachment #1: Type: text/plain, Size: 2960 bytes --]

On Wed, 15 Jul 2020 16:47:32 +0100
Stefan Hajnoczi <stefanha@redhat.com> wrote:

> On Wed, Jul 15, 2020 at 02:29:04PM +0100, Alex Bennée wrote:
> > Stefan Hajnoczi <stefanha@redhat.com> writes:  
> > > On Tue, Jul 14, 2020 at 10:43:36PM +0100, Alex Bennée wrote:  
> > >> Finally I'm curious if this is just a problem avoided by the s390
> > >> channel approach? Does the use of messages over a channel just avoid the
> > >> sort of bouncing back and forth that other hypervisors have to do when
> > >> emulating a device?  
> > >
> > > What does "bouncing back and forth" mean exactly?  
> > 
> > Context switching between guest and hypervisor.  
> 
> I have CCed Cornelia Huck, who can explain the lifecycle of an I/O
> request on s390 channel I/O.

Having read through this thread, I think this is mostly about
notifications? These are not using channel programs (which are only
used for things like feature negotiation, or emulating reading/writing
a config space, which does not really exist for channel devices.)

First, I/O and interrupts are highly abstracted on s390; much of the
register accesses or writes done on other architectures is just not
seen on s390.

Traditionally, I/O interrupts on s390 are tied to a subchannel; you
have a rather heavyweight process for that:

guest								host

					put status into subchannel
					queue interrupt
open up for I/O interrupt
					store some data into lowcore
					do PSW swap
interrupt handler called
read from lowcore
call tsch for subchannel
					store subchannel status into
					control block
process control block
look at subchannel indicators
virtio queue processing

This is only used for configuration change notifications, or for very
old legacy virtio implementations.

There's an alternative mechanism not tied to a subchannel, called
'adapter interrupts'. (It is even used to implement MSI-X on s390x,
which is why only virtio-pci devices using MSI-X are supported on
s390x.) It uses two-staged indicators: a global indicator to show
whether any secondary indicator is set, and secondary indicators (which
are per virtqueue in the virtio case.)

guest								host

					set queue indicator(s)
					set global indicator
					queue interrupt iff global
					indicator had not been set
open up for I/O interrupt
					store some data into lowcore
					do PSW swap
interrupt handler called
read from lowcore
look at indicators
virtio queue processing

This has less context switches than traditional I/O interrupts; but I
think the main benefit comes from the ability to batch notifications:
as long as the guest is still processing indicators, the host does not
need to notify again, it can just set indicators (which is why the
guest always needs to do two passes at processing.) We can already
batch per-device indicators with the classic approach, but adapter
interrupts allow to batch even across many devices.

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  parent reply	other threads:[~2020-07-15 17:02 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-14 21:43 [virtio-dev] On doorbells (queue notifications) Alex Bennée
2020-07-15 11:48 ` Stefan Hajnoczi
2020-07-15 13:29   ` Alex Bennée
2020-07-15 15:47     ` Stefan Hajnoczi
2020-07-15 16:40       ` Alex Bennée
2020-07-15 17:09         ` Cornelia Huck
2020-07-16 10:00         ` Stefan Hajnoczi
2020-07-16 11:25           ` Christophe de Dinechin
2020-07-16 14:19             ` Stefan Hajnoczi
2020-07-16 14:31               ` Christophe de Dinechin
2020-07-16 14:34               ` Christophe de Dinechin
2020-07-17  8:42                 ` Stefan Hajnoczi
2020-07-15 17:01       ` Cornelia Huck [this message]
2020-07-15 17:25         ` Alex Bennée
2020-07-15 20:04           ` Halil Pasic
2020-07-16  9:41             ` Cornelia Huck

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=20200715190147.05e71272.cohuck@redhat.com \
    --to=cohuck@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=chao.p.peng@linux.intel.com \
    --cc=jing2.liu@linux.intel.com \
    --cc=stefanha@redhat.com \
    --cc=virtio-dev@lists.oasis-open.org \
    --cc=zhabin@linux.alibaba.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.