Here is the series, split in two patches, with small edits and new commit messages. Paolo Bonzini (2): virtio-balloon spec: rewrite description of VIRTIO_BALLOON_F_MUST_TELL_HOST virtio-balloon spec: reintroduce "silent deflation" feature virtio-spec.lyx | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 233 insertions(+), 5 deletions(-) -- 1.8.2.1
Paolo Bonzini
2013-May-28 17:40 UTC
[PATCH v2 1/2] virtio-balloon spec: rewrite description of VIRTIO_BALLOON_F_MUST_TELL_HOST
The idea of the VIRTIO_BALLOON_F_MUST_TELL_HOST feature was to let drivers skip usage of the deflate queue when leaking the balloon ("silent deflation"). Guests may benefit from silent deflate by aggressively inflating the balloon; they know that they will be able to use ballooned pages without issuing a (blocking) request to the device. The original spec assumed that every driver supports VIRTIO_BALLOON_F_MUST_TELL_HOST, but this was not explicitly documented and in practice it turns out not to be the case; the Windows balloon driver does not tell the host correctly. Since all known device implementations support silent deflation, they do not negotiate the feature and we are thus free to redefine what the host should do about this feature. The Windows driver is also the only known driver that does not negotiate VIRTIO_BALLOON_F_MUST_TELL_HOST. Thus, even though the used to be meant for communication from the host, known drivers are really using it to communicate was in the other direction. Adjust the spec to conform. The original intent is reintroduced with a new feature bit in the next patch, while also fixing a problem with its definition. Signed-off-by: Paolo Bonzini <pbonzini at redhat.com> --- virtio-spec.lyx | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/virtio-spec.lyx b/virtio-spec.lyx index adec0a5..5c76a87 100644 --- a/virtio-spec.lyx +++ b/virtio-spec.lyx @@ -7219,11 +7219,46 @@ bits \begin_deeper \begin_layout Description -VIRTIO_BALLOON_F_MUST_TELL_HOST +VIRTIO_BALLOON_F_ +\change_deleted 1531152142 1347020601 +MUST +\change_inserted 1531152142 1347020602 +CAN +\change_unchanged +_TELL_HOST \begin_inset space ~ \end_inset -(0) Host must be told before pages from the balloon are used. +(0) +\change_deleted 1531152142 1347020625 +Host must be told +\change_inserted 1531152142 1347020617 +Guest is able to tell host +\change_unchanged + before pages from the balloon are used. + +\change_inserted 1531152142 1368005603 + The host must propose this feature if it has to be told + before pages from the balloon are used. +\begin_inset Foot +status open + +\begin_layout Plain Layout + +\change_inserted 1531152142 1347022389 +This feature used to be named VIRTIO_BALLOON_F_\SpecialChar \- +MUST_TELL_HOST. + However, after a few years it was observed that drivers were not using + it as specified. + The virtio-balloon spec was then adjusted to what the drivers had been + doing. +\end_layout + +\end_inset + + +\change_unchanged + \end_layout \begin_layout Description @@ -7382,9 +7417,15 @@ The driver constructs an array of addresses of memory pages it has previously \end_layout \begin_layout Enumerate -If the VIRTIO_BALLOON_F_MUST_TELL_HOST feature is set, the guest may not - use these requested pages until that descriptor in the deflateq has been - used by the device. +If the VIRTIO_BALLOON_F_ +\change_deleted 1531152142 1369761770 +MUST +\change_inserted 1531152142 1369761770 +CAN +\change_unchanged +_TELL_HOST feature is set, the guest may not use these requested pages until + that descriptor in the deflateq has been used by the device. + \end_layout \begin_layout Enumerate @@ -7396,10 +7437,21 @@ status open \begin_layout Plain Layout In this case, deflation advice is merely a courtesy +\change_inserted 1531152142 1369761798 +. + The guest need not use the deflateq at all. +\change_unchanged + \end_layout \end_inset + +\change_inserted 1531152142 1369761801 + If the host does not support this, it should not do anything when the balloon + is inflated or deflated, except put the descriptors on the used ring. + +\change_unchanged \end_layout -- 1.8.2.1
Paolo Bonzini
2013-May-28 17:40 UTC
[PATCH v2 2/2] virtio-balloon spec: reintroduce "silent deflation" feature
The original idea of the VIRTIO_BALLOON_F_MUST_TELL_HOST feature was to let drivers skip usage of the deflate queue when leaking the balloon ("silent deflation"). Guests may benefit from silent deflate by aggressively inflating the balloon; they know that they will be able to use ballooned pages without issuing a (blocking) request to the device. The previous patch redefined the feature to ensure correctness of the operation when drivers do not correctly report deflation. This patch adds back the optimization. The new feature bit is for the host to tell the drivers if silent deflation is actually supported. The meaning of the feature bit is reversed compared to the original, because the original meaning was not safe against migration. For features to be safe against migration, they have to be defined as "this is true if the guest _can_ do X". For such a "positive" feature, migration is possible if the destination supports it, or the source didn't set it: dest support source set ok? T T T T F T F T F F F T Instead, the old feature was defined as "this is true if the guest _cannot_ do X". For such a "negative" feature, migration is possible if the destination supports it, or the source sets it: dest support source set ok? T T T T F F F T T F F T However, the negotiated features are supposed to be the AND of the device- and driver-supported features. In the F/T case, the feature would be negotiated by the source as T, and become F when negotiated on the destination. Signed-off-by: Paolo Bonzini <pbonzini at redhat.com> --- virtio-spec.lyx | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) diff --git a/virtio-spec.lyx b/virtio-spec.lyx index 5c76a87..5da4fde 100644 --- a/virtio-spec.lyx +++ b/virtio-spec.lyx @@ -7267,6 +7267,20 @@ VIRTIO_BALLOON_F_STATS_VQ \end_inset (1) A virtqueue for reporting guest memory statistics is present. +\change_inserted 1531152142 1347020627 + +\end_layout + +\begin_layout Description + +\change_inserted 1531152142 1347020648 +VIRTIO_BALLOON_F_SILENT_DEFLATE +\begin_inset space ~ +\end_inset + +(2) Guest need not tell host before pages from the balloon are used. +\change_unchanged + \end_layout \end_deeper @@ -7627,6 +7641,168 @@ VIRTIO_BALLOON_S_MEMFREE The amount of memory not being used for any purpose VIRTIO_BALLOON_S_MEMTOT The total amount of memory available (in bytes). \end_layout +\begin_layout Description + +\change_inserted 1531152142 1368005515 +Silent +\begin_inset space ~ +\end_inset + +deflation +\end_layout + +\begin_layout Standard + +\change_inserted 1531152142 1368005515 + +\series medium +Some implementation of the balloon device may not require the guest to deflate + the balloon explicitly; instead, the guest may just take a page from its + reserve and start using it. + This is called +\begin_inset Quotes eld +\end_inset + +silent deflate +\begin_inset Quotes erd +\end_inset + + +\end_layout + +\begin_layout Standard + +\change_inserted 1531152142 1368005515 +In order to use this feature effectively, both the guest and the host need + to know how the other part intends to use the balloon. +\end_layout + +\begin_layout Standard + +\change_inserted 1531152142 1368005515 + +\series medium +Guests may benefit from silent deflate by aggressively inflating the balloon; + they know that they will be able to use ballooned pages without issuing + a (blocking) request to the device. +\end_layout + +\begin_layout Standard + +\change_inserted 1531152142 1368005515 +Knowing that the guest will +\emph on +not +\emph default + deflate silently also benefits the host. + For example, if the host is pinning the guest's memory, it may unpin ballooned + pages and pin them again upon deflation. + This allows cooperative memory overcommit even if the guest's memory is + pinned. +\end_layout + +\begin_layout Standard + +\change_inserted 1531152142 1368005515 +Thus, there are two possibilities for the host (either it does not support + silent deflate, or it does), and three for the guest (it doesn't need silent + deflate, it may choose to use it if available, it requires it). + Because there are three possibilities for the guest, support for silent + deflate is represented by two different feature bits. +\end_layout + +\begin_layout Standard + +\change_inserted 1531152142 1368005515 +The feature bits are used as follows: +\end_layout + +\begin_layout Itemize + +\change_inserted 1531152142 1368005671 +if the host does not support silent deflate, it must propose the +VIRTIO_\SpecialChar \- +BALLOON_F_\SpecialChar \- +CAN_\SpecialChar \- +TELL_\SpecialChar \- +HOST feature. + If the guest does +\emph on +not +\emph default + negotiate it, the host should assume that the guest will use silent deflate. + A host that does not support silent deflate then must do nothing on attempts + of the guest to deflate/inflate the balloon, except put the descriptors on + the used ring. +\end_layout + +\begin_layout Itemize + +\change_inserted 1531152142 1368005515 +a guest that +\emph on +must +\emph default + use silent deflation does not need to negotiate any feature. +\end_layout + +\begin_layout Itemize + +\change_inserted 1531152142 1368005676 +a guest that +\emph on +will never +\emph default + use silent deflation only has to propose VIRTIO_\SpecialChar \- +BALLOON_F_\SpecialChar \- +CAN_\SpecialChar \- +TELL_\SpecialChar \- +HOST. + It need not do anything if the host does not negotiate the feature. +\end_layout + +\begin_layout Itemize + +\change_inserted 1531152142 1368005686 +a guest that +\emph on +can optionally +\emph default + use silent deflation should propose both VIRTIO_\SpecialChar \- +BALLOON_F_\SpecialChar \- +CAN_\SpecialChar \- +TELL_\SpecialChar \- +HOST + and VIRTIO_\SpecialChar \- +BALLOON_F_\SpecialChar \- +SILENT_\SpecialChar \- +DEFLATE. + The guest driver can then use silent deflation if and only if the host + has negotiated VIRTIO_\SpecialChar \- +BALLOON_F_\SpecialChar \- +SILENT_\SpecialChar \- +DEFLATE too. +\end_layout + +\begin_layout Standard + +\change_inserted 1531152142 1368005690 +Hosts are free to propose the VIRTIO_\SpecialChar \- +BALLOON_F_\SpecialChar \- +CAN_\SpecialChar \- +TELL_\SpecialChar \- +HOST feature even if they support silent deflation. + It will + not affect operation of a well-behaving guest; such a guest + should never check if the host proposed the feature, and + should not assume that lack of this feature implies support + for silent deflation. The only bit to check for this purpose is + VIRTIO_\SpecialChar \- +BALLOON_F_\SpecialChar \- +SILENT_\SpecialChar \- +DEFLATE. +\end_layout + \begin_layout Chapter* Appendix H: Rpmsg: Remote Processor Messaging \end_layout -- 1.8.2.1
Michael S. Tsirkin
2013-May-28 18:15 UTC
[PATCH v2 1/2] virtio-balloon spec: rewrite description of VIRTIO_BALLOON_F_MUST_TELL_HOST
On Tue, May 28, 2013 at 07:40:17PM +0200, Paolo Bonzini wrote:> The idea of the VIRTIO_BALLOON_F_MUST_TELL_HOST feature was to let drivers > skip usage of the deflate queue when leaking the balloon ("silent > deflation"). Guests may benefit from silent deflate by aggressively > inflating the balloon; they know that they will be able to use ballooned > pages without issuing a (blocking) request to the device. > > The original spec assumed that every driver supports > VIRTIO_BALLOON_F_MUST_TELL_HOST, but this was not explicitly documented > and in practice it turns out not to be the case; the Windows balloon > driver does not tell the host correctly. > > Since all known device implementations support silent deflation, they > do not negotiate the feature and we are thus free to redefine what > the host should do about this feature. > > The Windows driver is also the only known driver that does not > negotiate VIRTIO_BALLOON_F_MUST_TELL_HOST. Thus, even though the > used to be meant for communication from the host, known drivers are > really using it to communicate was in the other direction. > > Adjust the spec to conform. The original intent is reintroduced with > a new feature bit in the next patch, while also fixing a problem with > its definition. > > Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>What you write in spec below and what you write above seems to contradict. Look, how about the simpler patch that I sent: "[PATCH] virtio-spec: balloon: MUST_TELL_HOST is optional" does it functionally do everything you want in this patch? If yes maybe you could pick that up, and add a patch with renames and text clarifications on top? More comments below.> --- > virtio-spec.lyx | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 57 insertions(+), 5 deletions(-) > > diff --git a/virtio-spec.lyx b/virtio-spec.lyx > index adec0a5..5c76a87 100644 > --- a/virtio-spec.lyx > +++ b/virtio-spec.lyx > @@ -7219,11 +7219,46 @@ bits > > \begin_deeper > \begin_layout Description > -VIRTIO_BALLOON_F_MUST_TELL_HOST > +VIRTIO_BALLOON_F_ > +\change_deleted 1531152142 1347020601 > +MUST > +\change_inserted 1531152142 1347020602 > +CAN > +\change_unchanged > +_TELL_HOST > \begin_inset space ~ > \end_inset > > -(0) Host must be told before pages from the balloon are used. > +(0) > +\change_deleted 1531152142 1347020625 > +Host must be told > +\change_inserted 1531152142 1347020617 > +Guest is able to tell host > +\change_unchanged > + before pages from the balloon are used. > +This "can" and "is able" is IMO more confusing than clarifying. Let's be definite. If feature is negotiated, guest must tell host. If it's not, it does not. That's why it's MUST not CAN. And text should be "When negotiated, guest tells host before pages from the balloon are used. "> +\change_inserted 1531152142 1368005603 > + The host must propose this featureWe don't say "propose feature" anyway in the spec. You really mean "set this feature bit" ?> if it has to be told > + before pages from the balloon are used.Has to? Not at all. It can't assume anything until guest has negotiated the feature. So it should be "if it wants to be told before pages from the balloon are used".> +\begin_inset Foot > +status open > + > +\begin_layout Plain Layout > + > +\change_inserted 1531152142 1347022389 > +This feature used to be named VIRTIO_BALLOON_F_\SpecialChar \- > +MUST_TELL_HOST. > + However, after a few years it was observed that drivers were not using > + it as specified. > + The virtio-balloon spec was then adjusted to what the drivers had been > + doing.I'm not sure what good does this historical note do us. I would say: Historically the spec required all drivers to acknowledge this feature bit. However, no known hypervisor relies on this feature bit being acknowledged unconditionally. Thus, it's safe for drivers to ignore the TELL_HOST feature.> +\end_layout > + > +\end_inset > + > + > +\change_unchanged > + > \end_layout > > \begin_layout Description > @@ -7382,9 +7417,15 @@ The driver constructs an array of addresses of memory pages it has previously > \end_layout > > \begin_layout Enumerate > -If the VIRTIO_BALLOON_F_MUST_TELL_HOST feature is set, the guest may not > - use these requested pages until that descriptor in the deflateq has been > - used by the device. > +If the VIRTIO_BALLOON_F_ > +\change_deleted 1531152142 1369761770 > +MUST > +\change_inserted 1531152142 1369761770 > +CAN > +\change_unchanged > +_TELL_HOST feature is set, the guest may not use these requested pages until > + that descriptor in the deflateq has been used by the device.Not if it is set. If it's *negotiated*.> + > \end_layout > > \begin_layout Enumerate > @@ -7396,10 +7437,21 @@ status open > > \begin_layout Plain Layout > In this case, deflation advice is merely a courtesy > +\change_inserted 1531152142 1369761798 > +. > + The guest need not use the deflateq at all. > +\change_unchanged > + > \end_layout > > \end_inset > > + > +\change_inserted 1531152142 1369761801 > + If the host does not support this, it should not do anything when the balloon > + is inflated or deflated, except put the descriptors on the used ring.Not true. It simply can't rely on balloon to tell it before pages are used. But, just as an example, we can make kvm exit to qemu when guest attempts to use such a page, and then we'll know it is used without an explicit notification.> + > +\change_unchanged > > \end_layout > > -- > 1.8.2.1 >
Michael S. Tsirkin
2013-May-29 07:49 UTC
[PATCH v2 2/2] virtio-balloon spec: reintroduce "silent deflation" feature
On Tue, May 28, 2013 at 07:40:18PM +0200, Paolo Bonzini wrote:> The original idea of the VIRTIO_BALLOON_F_MUST_TELL_HOST feature was to > let drivers skip usage of the deflate queue when leaking the balloon > ("silent deflation"). Guests may benefit from silent deflate by > aggressively inflating the balloon; they know that they will be able to > use ballooned pages without issuing a (blocking) request to the device. > > The previous patch redefined the feature to ensure correctness of the > operation when drivers do not correctly report deflation. This patch > adds back the optimization. > > The new feature bit is for the host to tell the drivers if silent > deflation is actually supported. The meaning of the feature bit is > reversed compared to the original, because the original meaning was > not safe against migration. > > For features to be safe against migration, they have to be defined as > "this is true if the guest _can_ do X". For such a "positive" feature, > migration is possible if the destination supports it, or the source > didn't set it: > > dest support source set ok? > T T T > T F T > F T F > F F T > > Instead, the old feature was defined as "this is true if the guest > _cannot_ do X". For such a "negative" feature, migration is possible > if the destination supports it, or the source sets it: > > dest support source set ok? > T T T > T F F > F T T > F F T > > However, the negotiated features are supposed to be the AND of the > device- and driver-supported features. In the F/T case, the feature > would be negotiated by the source as T, and become F when negotiated on > the destination. > > Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>Do you have any numbers showing how this new feature improves performance? We are able to batch quite a lot of pages in a single deflate request - is the overhead measureable in practice?> --- > virtio-spec.lyx | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 197 insertions(+) > > diff --git a/virtio-spec.lyx b/virtio-spec.lyx > index 5c76a87..5da4fde 100644 > --- a/virtio-spec.lyx > +++ b/virtio-spec.lyx > @@ -7267,6 +7267,20 @@ VIRTIO_BALLOON_F_STATS_VQ > \end_inset > > (1) A virtqueue for reporting guest memory statistics is present. > +\change_inserted 1531152142 1347020627 > + > +\end_layout > + > +\begin_layout Description > + > +\change_inserted 1531152142 1347020648 > +VIRTIO_BALLOON_F_SILENT_DEFLATE > +\begin_inset space ~ > +\end_inset > + > +(2) Guest need not tell host before pages from the balloon are used. > +\change_unchanged > + > \end_layout > > \end_deeper > @@ -7627,6 +7641,168 @@ VIRTIO_BALLOON_S_MEMFREE The amount of memory not being used for any purpose > VIRTIO_BALLOON_S_MEMTOT The total amount of memory available (in bytes). > \end_layout > > +\begin_layout Description > + > +\change_inserted 1531152142 1368005515 > +Silent > +\begin_inset space ~ > +\end_inset > + > +deflation > +\end_layout > + > +\begin_layout Standard > + > +\change_inserted 1531152142 1368005515 > + > +\series medium > +Some implementation of the balloon device may not require the guest to deflate > + the balloon explicitly; instead, the guest may just take a page from its > + reserve and start using it. > + This is called > +\begin_inset Quotes eld > +\end_inset > + > +silent deflate > +\begin_inset Quotes erd > +\end_inset > + > + > +\end_layout > + > +\begin_layout Standard > + > +\change_inserted 1531152142 1368005515 > +In order to use this feature effectively, both the guest and the host need > + to know how the other part intends to use the balloon. > +\end_layout > + > +\begin_layout Standard > + > +\change_inserted 1531152142 1368005515 > + > +\series medium > +Guests may benefit from silent deflate by aggressively inflating the balloon; > + they know that they will be able to use ballooned pages without issuing > + a (blocking) request to the device. > +\end_layout > + > +\begin_layout Standard > + > +\change_inserted 1531152142 1368005515 > +Knowing that the guest will > +\emph on > +not > +\emph default > + deflate silently also benefits the host. > + For example, if the host is pinning the guest's memory, it may unpin ballooned > + pages and pin them again upon deflation. > + This allows cooperative memory overcommit even if the guest's memory is > + pinned. > +\end_layout > + > +\begin_layout Standard > + > +\change_inserted 1531152142 1368005515 > +Thus, there are two possibilities for the host (either it does not support > + silent deflate, or it does), and three for the guest (it doesn't need silent > + deflate, it may choose to use it if available, it requires it). > + Because there are three possibilities for the guest, support for silent > + deflate is represented by two different feature bits. > +\end_layout > + > +\begin_layout Standard > + > +\change_inserted 1531152142 1368005515 > +The feature bits are used as follows: > +\end_layout > + > +\begin_layout Itemize > + > +\change_inserted 1531152142 1368005671 > +if the host does not support silent deflate, it must propose the > +VIRTIO_\SpecialChar \- > +BALLOON_F_\SpecialChar \- > +CAN_\SpecialChar \- > +TELL_\SpecialChar \- > +HOST feature. > + If the guest does > +\emph on > +not > +\emph default > + negotiate it, the host should assume that the guest will use silent deflate. > + A host that does not support silent deflate then must do nothing on attempts > + of the guest to deflate/inflate the balloon, except put the descriptors on > + the used ring. > +\end_layout > + > +\begin_layout Itemize > + > +\change_inserted 1531152142 1368005515 > +a guest that > +\emph on > +must > +\emph default > + use silent deflation does not need to negotiate any feature. > +\end_layout > + > +\begin_layout Itemize > + > +\change_inserted 1531152142 1368005676 > +a guest that > +\emph on > +will never > +\emph default > + use silent deflation only has to propose VIRTIO_\SpecialChar \- > +BALLOON_F_\SpecialChar \- > +CAN_\SpecialChar \- > +TELL_\SpecialChar \- > +HOST. > + It need not do anything if the host does not negotiate the feature. > +\end_layout > + > +\begin_layout Itemize > + > +\change_inserted 1531152142 1368005686 > +a guest that > +\emph on > +can optionally > +\emph default > + use silent deflation should propose both VIRTIO_\SpecialChar \- > +BALLOON_F_\SpecialChar \- > +CAN_\SpecialChar \- > +TELL_\SpecialChar \- > +HOST > + and VIRTIO_\SpecialChar \- > +BALLOON_F_\SpecialChar \- > +SILENT_\SpecialChar \- > +DEFLATE. > + The guest driver can then use silent deflation if and only if the host > + has negotiated VIRTIO_\SpecialChar \- > +BALLOON_F_\SpecialChar \- > +SILENT_\SpecialChar \- > +DEFLATE too. > +\end_layout > + > +\begin_layout Standard > + > +\change_inserted 1531152142 1368005690 > +Hosts are free to propose the VIRTIO_\SpecialChar \- > +BALLOON_F_\SpecialChar \- > +CAN_\SpecialChar \- > +TELL_\SpecialChar \- > +HOST feature even if they support silent deflation. > + It will > + not affect operation of a well-behaving guest; such a guest > + should never check if the host proposed the feature, and > + should not assume that lack of this feature implies support > + for silent deflation. The only bit to check for this purpose is > + VIRTIO_\SpecialChar \- > +BALLOON_F_\SpecialChar \- > +SILENT_\SpecialChar \- > +DEFLATE. > +\end_layout > + > \begin_layout Chapter* > Appendix H: Rpmsg: Remote Processor Messaging > \end_layout > -- > 1.8.2.1
Michael S. Tsirkin
2013-May-29 14:21 UTC
[PATCH v2 0/2] virtio-balloon spec: silent deflation
On Tue, May 28, 2013 at 07:40:16PM +0200, Paolo Bonzini wrote:> Here is the series, split in two patches, with small edits and new > commit messages. > > Paolo Bonzini (2): > virtio-balloon spec: rewrite description of > VIRTIO_BALLOON_F_MUST_TELL_HOST > virtio-balloon spec: reintroduce "silent deflation" feature > > virtio-spec.lyx | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 233 insertions(+), 5 deletions(-)Okay we talked off-line a bit, here's a summary: - we both agree we want my patch making TELL_HOST optional, just to make current practice with windows drivers, legal. Will ask Rusty to re-consider it for inclusion. - Paolo's patches need some experimentation, it's not 100% clear what the benefit is, and maybe it's possible to get same gains without spec/guest driver changes.> -- > 1.8.2.1