[Spice-devel] [spice-protocol PATCH v2 0.12.2 1/2] qxl_dev.h: add client monitors configuration notification to guest

Alon Levy alevy at redhat.com
Wed Sep 12 01:24:31 PDT 2012


> On 09/11/12 17:32, Alon Levy wrote:
> >> Hi,
> >>
> >> On 09/11/2012 04:35 PM, Alon Levy wrote:
> >>> So far we have used the agent to notify the guest of a request to
> >>> change
> >>> the monitors configurations (heads) on the qxl device. This patch
> >>> introduces
> >>> a new interrupt and new fields in the qxl rom to notify the guest
> >>> about
> >>> a new request, similarly to how physical hardware notifies the
> >>> driver.
> >>>
> >>> To avoid overwriting the rom while the guest is reading it there
> >>> is
> >>> a
> >>> client_monitors_config_updating field in ROM. The update protocol
> >>> is:
> >>>
> >>> qemu:
> >>>    (1) set QXLRom::client_monitors_config_updating
> >>>    (2) fill QXLRom::client_monitors_config
> >>>    (3) raise QXL_INTERRUPT_CLIENT_MONITORS_CONFIG
> >>>    (4) clear QXLRom::client_monitors_config_updating
> >>>
> >>> guest:
> >>>    (1) clear QXL_INTERRUPT_CLIENT_MONITORS_CONFIG bit in irq
> >>>    status
> >>>    (2) wait until QXLRom::client_monitors_config_updating is
> >>>    clear
> >>>    (3) parse QXLRom::client_monitors_config
> >>>    (4) check that QXLRom::client_monitors_Config_updating is
> >>>    clear
> >>>        (a) when set, goto (1)
> >>>    (5) check QXL_INTERRUPT_CLIENT_MONITORS_CONFIG bit in irq
> >>>    status
> >>>        (a) when set, goto (1)
> >>>        (b) when clear we are done
> >>>
> >>
> >> This seems very complicated how about:
> >>
> >> qemu:
> >>     (1) fill QXLRom::client_monitors_config, including a crc32 of
> >>     the
> >>     data
> >>     (2) raise QXL_INTERRUPT_CLIENT_MONITORS_CONFIG
> >>
> >> guest on interrupt:
> >>     (1) clear QXL_INTERRUPT_CLIENT_MONITORS_CONFIG bit in irq
> >>     status
> >>     (2) read QXLRom::client_monitors_config
> >>     (3) (verify-crc)? done : goto 2
> >>
> >> That seems more straight-forward to me.
> > 
> > Requires crc computing code in qemu and the guest. I know there is
> > such in the kernel. I guess it's fine. It also has the chance of a
> > mistake, I can let that slide I guess..
> 
> I'm not sure it is actually simpler.  Using
> client_monitors_config_updating is just two lines of code on the qemu
> side (set & clear the bit).  Dunno about crc32, maybe we have such a
> function somewhere in the networking code which we can reuse.

there is crc32 from zlib.h, used elsewhere. There are a few other implementation of crc32/16 in qemu. Linux has linux/crc32.h but surprise it and zlib don't match (well, it's expected - there is no crc32 spec, it depends on the polynomial, if you xor before or after).

I don't really mind which solution we use, I can send patches for the crc32 one already.

> 
> On the guest side using client_monitors_config_updating isn't that
> complicated too.  The only thing which might add significant
> complexity
> is (2) as this pretty much requires to not run this from irq context.
> Otherwise it just adds a loop (needed for crc32 too) and two simple
> checks.
> 
> > But more importantly I think I still need to change the protocol. I
> > still need to know if the guest supports the client_monitors_config
> > before issuing it, to take care of the case of a
> > VDAgentMonitorsConfig
> > arriving in multiple chunks, and for that I think one of:
> 
> >  QXLInterface::client_monit-rs_config_supported()
> > 
> > pro: straightforward
> > con: add such for each cap? might as well add the
> > guest_capabilities I introduced before, only this time set this
> > cap from qemu instead of via a guest io (and don't introduce that
> > guest io since we won't need it
> > 
> > alternative, reuse client_monitors_config, but have a NULL
> > parameter just check and return without actually sending a message
> > pro: no extra api
> > con: abuse of a function
> > 
> > What do you think?
> 
> I'd tend to go with QXLInterface::client_monitors_config(NULL).
> 
> But can't you just queue up the packets in spice-server until
> VDAgentMonitorsConfig is complete?  You must do that anyway to
> assemble
> the data for the client_monitors_config call, right?  Then send all
> packets in one go after the client_monitors_config call returns (or
> drop
> them, depending on the return value).
> 

Yes, I queue the packets in order to assemble them for the client_monitors_config(not NULL) call, but it's still a bit (tiny bit, admitted) simpler not to pass it to the spice-server char device afterwords. I'll send the patches with the client_monitors_config(NULL) implementation.

> cheers,
>   Gerd
> 
> 


More information about the Spice-devel mailing list