Re: monitors_config rework: proposed protocol changes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2018-07-09 at 16:53 -0500, Jonathon Jongsma wrote:
> Apologies for the delay in replying to this email. It's an excellent
> summary of the options.
> 
> On Tue, 2018-06-26 at 15:34 +0200, Lukáš Hrázký wrote:
> > Hi all,
> > 
> > after posting the PoC patch series for the monitors_config rework and
> > the discussion there getting a bit hard to follow, I thought I'd try
> > to
> > summarize the proposed protocol. There are also spice-gtk API changes
> > to consider, which I've decided to leave for a later email.
> > 
> > There are two variants for consideration right now:
> > 
> > 
> > Variant 1
> > =========
> > 
> > server -> client
> > ----------------
> > 
> > struct SpiceMsgDisplayHead {
> > -   uint32_t id;
> > +   uint32_t monitor_id;
> >     uint32_t surface_id;
> > +   int32_t guest_output_id;
> >     uint32_t width;
> >     uint32_t height;
> >     uint32_t x;
> >     uint32_t y;
> >     uint32_t flags;
> > +   uint8_t reserved[?];
> > };
> > 
> > struct SpiceMsgDisplayMonitorsConfig {
> >     uint16_t count;
> >     uint16_t max_allowed;
> >     struct SpiceMsgDisplayHead heads[0];
> > };
> > 
> > 
> > client -> server -> vd_agent
> > ----------------------------
> > 
> > struct VDAgentMonConfig {
> > +   uint32_t channel_id;
> > +   uint32_t monitor_id;
> > +   int32_t guest_output_id;
> >     uint32_t height;
> >     uint32_t width;
> >     uint32_t depth;
> >     int32_t x;
> >     int32_t y;
> > +   uint8_t reserved[?];
> > };
> > 
> > struct VDAgentMonitorsConfig {
> >     uint32_t num_of_monitors;
> >     uint32_t flags;
> >     struct VDAgentMonConfig monitors[];
> > };
> > 
> > 
> > The "SpiceMsgDisplayHead::id" is renamed to "monitor_id" for
> > consistency. It is defined in spice-common, so I believe we can do
> > that
> > without breaking anything.
> > 
> > The name of the "guest_output_id" is subject to discussion, I'd
> > prefer
> > to make it clear it is an ID originating from the guest.
> > "guest_display_id" is an option.
> > 
> > The value of the "guest_output_id" would be a zero-based sequence, an
> > index of an output in xrandr, with -1 meaning the value is unset. (as
> > opposed to the v1 of the patch series, where the sequence was one-
> > based, 0 meaning it's unset).
> > 
> > The "reserved" fields are added based on Christophe de Dinechin's
> > suggestion to prepare for possible features described in [1].
> > 
> > 
> > Variant 2
> > =========
> > 
> > The protocol changes are the same as in Variant 1, except we do not
> > add
> > the guest_output_id to the messages (and only add channel_id and
> > monitor_id to VDAgentMonConfig). The guest_output_id can be kept in a
> > map on the server, to which the key would be the (channel_id,
> > monitor_id) pair.
> > 
> > The guest_output_id can then be fetched from the map when needed and
> > after that the mechanisms are identical in theory. In practice the
> > guest_output_id is needed mainly (and most probably only) in messages
> > to the vd_agent. As of now for example the VDAgentMonitorsConfig
> > message is forwarded to the vd_agent as-is on the server, which would
> > need bigger code changes and different messages for client -> server
> > and for server -> agent.
> > 
> > Variant 2 would also require to change the protocol of
> > SpiceMsgcMousePosition (the mouse position even sent from the client
> > to
> > the server), which now sends a display_id, which is equivalent to
> > guest_output_id, but now would have to send (channel_id, monitor_id).
> > Doing this is not necessarily a bad idea even if we go with Variant
> > 1.
> > 
> 
> I personally prefer variant 2 over variant 1. It doesn't seem necessary
> for the client to deal with the guest_output_id, especially since the
> guest_output_id can be deduced by the server from the
> channel_id/monitor_id pair. 
> 
> If the client does send all three values, we need the server to be able
> to deal with a buggy client that sends a guest_output_id that doesn't
> match with what the server thinks should be the guest_output_id for the
> channel_id/monitor_id pair. So I think that exposing the
> guest_output_id to the client complicates things somewhat.

To be precise, if we sent the guest_output_id to the client, there
would be little reason to also store it on the server and we wouldn't
therefore do such a check... What comes from the client must be
correct, otherwise it won't work, as always :)

> On the other hand, this means that the server needs to mess with the
> agent message rather than sending it on verbatim to the agent. That's
> not ideal either, but overall I think it's not bad enough to support
> variant 1 over variant 2.

Indeed, it's some extra work. Although an argument could be made that
client <-> server and server <-> vd_agent are two different protocols
and therefore shouldn't share messages. But that's mostly off-topic...

> > I think the decision between the variants boils down to whether we
> > want
> > all the monitors_config data go to the client (and therefore adding
> > anything means a protocol change), or keep the client <-> server
> > protocol to the bare minimum and store the rest on the server. I
> > would
> > say, though, that majority of the data we would ever want to add to
> > the
> > monitors_config message would be becase we need it on the client (the
> > amount of information Christophe wanted to add to the messages for
> > the
> > client seems to be in accord with that). So in that case the map
> > would
> > just be a mostly useless complication of the code?
> 
> I'm not quite sure I understand what you mean by this part. Can you
> give a concrete example of what data we might want to add?

For example everything that c3d suggested we add to the messages for
future use:

- output name
- DPI
- refresh rate
- gamma
- ...

Can't predict the future, but as I said, if we ever want to extend the
monitors_config messages, it quite probably will be because we want to
get some information to the client.

So to reiterate, if we add the following map structure to the server:

[channel_id, monitor_id] -> struct mc_data { guest_output_id }

In hope it will save us from having to change the protocol in the
future by adding more fields to the mc_data, chances are it won't help
us (because we want to send it to the client anyway) and the
guest_output_id will stay the sole field in the struct.

And the server code will be more complex because of this single field.

I hope it's understandable and you get my point :)

Anyway, (unless you reconsider) it's you and Frediano in favor of
Variant 2 and I'm sort of impartial myself, so I think we go for it.

Cheers,
Lukas

> Jonathon
> 
> > 
> > Cheers,
> > Lukas
> > 
> > 
> > [1] https://lists.freedesktop.org/archives/spice-devel/2018-June/0442
> > 30.html
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel@xxxxxxxxxxxxxxxxxxxxx
> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux Virtualization]     [Linux Virtualization]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]