[Spice-devel] [Qemu-devel] [PATCH v3] qxl: allow to specify head limit to qxl driver
Frediano Ziglio
fziglio at redhat.com
Mon Jul 13 04:32:50 PDT 2015
Ping
----- Original Message -----
> From: "Frediano Ziglio" <fziglio at redhat.com>
> To: kraxel at redhat.com, spice-devel at lists.freedesktop.org, berrange at redhat.com
> Cc: qemu-devel at nongnu.org, "Frediano Ziglio" <fziglio at redhat.com>
> Sent: Monday, July 6, 2015 7:56:38 AM
> Subject: [Qemu-devel] [PATCH v3] qxl: allow to specify head limit to qxl driver
>
> This patch allow to limit number of heads using qxl driver. By default
> qxl driver is not limited on any kind on head use so can decide to use
> as much heads.
>
> libvirt has this as a video card parameter (actually set to 1 but not
> used). This parameter will allow to limit setting a use can do (which
> could be confusing).
>
> This patch rely on some change in spice-protocol which are not still
> accepted. See
> http://lists.freedesktop.org/archives/spice-devel/2015-June/020221.html.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> hw/display/qxl.c | 26 +++++++++++++++++++++-----
> hw/display/qxl.h | 3 +++
> 2 files changed, 24 insertions(+), 5 deletions(-)
>
> Changes from v2:
> - removed the RPC after spice-server upstream
> - rebased
>
> diff --git a/hw/display/qxl.c b/hw/display/qxl.c
> index f87a5ee..4e5ff69 100644
> --- a/hw/display/qxl.c
> +++ b/hw/display/qxl.c
> @@ -271,6 +271,12 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice
> *qxl, int replay)
> QXL_COOKIE_TYPE_POST_LOAD_MONITORS_CONFIG,
> 0));
> } else {
> +#if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */
> + if (qxl->max_outputs) {
> + spice_qxl_set_monitors_config_limit(&qxl->ssd.qxl,
> + qxl->max_outputs);
> + }
> +#endif
> qxl->guest_monitors_config = qxl->ram->monitors_config;
> spice_qxl_monitors_config_async(&qxl->ssd.qxl,
> qxl->ram->monitors_config,
> @@ -991,6 +997,7 @@ static int interface_client_monitors_config(QXLInstance
> *sin,
> PCIQXLDevice *qxl = container_of(sin, PCIQXLDevice, ssd.qxl);
> QXLRom *rom = memory_region_get_ram_ptr(&qxl->rom_bar);
> int i;
> + unsigned max_outputs = ARRAY_SIZE(rom->client_monitors_config.heads);
>
> if (qxl->revision < 4) {
> trace_qxl_client_monitors_config_unsupported_by_device(qxl->id,
> @@ -1013,17 +1020,23 @@ static int
> interface_client_monitors_config(QXLInstance *sin,
> if (!monitors_config) {
> return 1;
> }
> +
> +#if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */
> + /* limit number of outputs based on setting limit */
> + if (qxl->max_outputs && qxl->max_outputs <= max_outputs) {
> + max_outputs = qxl->max_outputs;
> + }
> +#endif
> +
> memset(&rom->client_monitors_config, 0,
> sizeof(rom->client_monitors_config));
> rom->client_monitors_config.count = monitors_config->num_of_monitors;
> /* monitors_config->flags ignored */
> - if (rom->client_monitors_config.count >=
> - ARRAY_SIZE(rom->client_monitors_config.heads)) {
> + if (rom->client_monitors_config.count >= max_outputs) {
> trace_qxl_client_monitors_config_capped(qxl->id,
> monitors_config->num_of_monitors,
> -
> ARRAY_SIZE(rom->client_monitors_config.heads));
> - rom->client_monitors_config.count =
> - ARRAY_SIZE(rom->client_monitors_config.heads);
> + max_outputs);
> + rom->client_monitors_config.count = max_outputs;
> }
> for (i = 0 ; i < rom->client_monitors_config.count ; ++i) {
> VDAgentMonConfig *monitor = &monitors_config->monitors[i];
> @@ -2274,6 +2287,9 @@ static Property qxl_properties[] = {
> DEFINE_PROP_UINT32("vram64_size_mb", PCIQXLDevice, vram_size_mb,
> -1),
> DEFINE_PROP_UINT32("vgamem_mb", PCIQXLDevice, vgamem_size_mb, 16),
> DEFINE_PROP_INT32("surfaces", PCIQXLDevice, ssd.num_surfaces, 1024),
> +#if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */
> + DEFINE_PROP_UINT16("max_outputs", PCIQXLDevice, max_outputs, 0),
> +#endif
> DEFINE_PROP_END_OF_LIST(),
> };
>
> diff --git a/hw/display/qxl.h b/hw/display/qxl.h
> index deddd54..2ddf065 100644
> --- a/hw/display/qxl.h
> +++ b/hw/display/qxl.h
> @@ -99,6 +99,9 @@ typedef struct PCIQXLDevice {
> QXLModes *modes;
> uint32_t rom_size;
> MemoryRegion rom_bar;
> +#if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */
> + uint16_t max_outputs;
> +#endif
>
> /* vram pci bar */
> uint32_t vram_size;
> --
> 2.1.0
>
>
>
More information about the Spice-devel
mailing list