diff mbox

[2/2] libxl: introduce gfx_passthru_kind

Message ID 1425632903-5502-3-git-send-email-tiejun.chen@intel.com
State New
Headers show

Commit Message

Tiejun Chen March 6, 2015, 9:08 a.m. UTC
Although we already have 'gfx_passthru' in b_info, this doesn' suffice
after we want to handle IGD specifically. Now we define a new field of
type, gfx_passthru_kind, to indicate we're trying to pass IGD. Actually
this means we can benefit this to support other specific devices just
by extending gfx_passthru_kind. And then we can cooperate with
gfx_passthru to address IGD cases as follows:

    gfx_passthru = 0    => sets build_info.u.gfx_passthru to false
    gfx_passthru = 1    => sets build_info.u.gfx_passthru to false and
                           build_info.u.gfx_passthru_kind to DEFAULT
    gfx_passthru = "igd"    => sets build_info.u.gfx_passthru to false
                               and build_info.u.gfx_passthru_kind to IGD

Here if gfx_passthru_kind = DEFAULT, we will call
libxl__is_igd_vga_passthru() to check if we're hitting that table to need
to pass that option to qemu. But if gfx_passthru_kind = "igd" we always
force to pass that.

Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
---
 tools/libxl/libxl_dm.c      | 13 +++++++++++++
 tools/libxl/libxl_types.idl |  6 ++++++
 tools/libxl/xl_cmdimpl.c    | 19 +++++++++++++++++--
 3 files changed, 36 insertions(+), 2 deletions(-)

Comments

Tiejun Chen March 6, 2015, 9:18 a.m. UTC | #1
On 2015/3/6 17:08, Tiejun Chen wrote:
> Although we already have 'gfx_passthru' in b_info, this doesn' suffice
> after we want to handle IGD specifically. Now we define a new field of
> type, gfx_passthru_kind, to indicate we're trying to pass IGD. Actually
> this means we can benefit this to support other specific devices just
> by extending gfx_passthru_kind. And then we can cooperate with
> gfx_passthru to address IGD cases as follows:
>
>      gfx_passthru = 0    => sets build_info.u.gfx_passthru to false
>      gfx_passthru = 1    => sets build_info.u.gfx_passthru to false and
>                             build_info.u.gfx_passthru_kind to DEFAULT
>      gfx_passthru = "igd"    => sets build_info.u.gfx_passthru to false
>                                 and build_info.u.gfx_passthru_kind to IGD
>
> Here if gfx_passthru_kind = DEFAULT, we will call
> libxl__is_igd_vga_passthru() to check if we're hitting that table to need
> to pass that option to qemu. But if gfx_passthru_kind = "igd" we always
> force to pass that.
>
> Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
> ---
>   tools/libxl/libxl_dm.c      | 13 +++++++++++++
>   tools/libxl/libxl_types.idl |  6 ++++++
>   tools/libxl/xl_cmdimpl.c    | 19 +++++++++++++++++--
>   3 files changed, 36 insertions(+), 2 deletions(-)
>
> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> index 8599a6a..780dd2a 100644
> --- a/tools/libxl/libxl_dm.c
> +++ b/tools/libxl/libxl_dm.c

Sorry, looks I'm missing to remove '-gfx_passthru' since this should be 
gone in the case of qemu upstream,

@@ -710,9 +710,6 @@ static char ** 
libxl__build_device_model_args_new(libxl__gc *gc,
              flexarray_append(dm_args, "-net");
              flexarray_append(dm_args, "none");
          }
-        if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
-            flexarray_append(dm_args, "-gfx_passthru");
-        }
      } else {
          if (!sdl && !vnc) {
              flexarray_append(dm_args, "-nographic");

I will fold this into next revision after this review.

Thanks
Tiejun

> @@ -757,6 +757,19 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
>                                               machinearg, max_ram_below_4g);
>               }
>           }
> +
> +        if (b_info->u.hvm.gfx_passthru_kind ==
> +                LIBXL_GFX_PASSTHRU_KIND_DEFAULT) {
> +            if (libxl__is_igd_vga_passthru(gc, guest_config)) {
> +                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
> +            }
> +        } else if (b_info->u.hvm.gfx_passthru_kind ==
> +                        LIBXL_GFX_PASSTHRU_KIND_IGD) {
> +                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
> +        } else {
> +            LOG(WARN, "gfx_passthru_kind is invalid so ignored.\n");
> +        }
> +
>           flexarray_append(dm_args, machinearg);
>           for (i = 0; b_info->extra_hvm && b_info->extra_hvm[i] != NULL; i++)
>               flexarray_append(dm_args, b_info->extra_hvm[i]);
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index 02be466..e209460 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -140,6 +140,11 @@ libxl_tsc_mode = Enumeration("tsc_mode", [
>       (3, "native_paravirt"),
>       ])
>
> +libxl_gfx_passthru_kind = Enumeration("gfx_passthru_kind", [
> +    (0, "default"),
> +    (1, "igd"),
> +    ], init_val = "LIBXL_GFX_PASSTHRU_KIND_DEFAULT")
> +
>   # Consistent with the values defined for HVM_PARAM_TIMER_MODE.
>   libxl_timer_mode = Enumeration("timer_mode", [
>       (-1, "unknown"),
> @@ -430,6 +435,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
>                                          ("spice",            libxl_spice_info),
>
>                                          ("gfx_passthru",     libxl_defbool),
> +                                       ("gfx_passthru_kind",     libxl_gfx_passthru_kind),
>
>                                          ("serial",           string),
>                                          ("boot",             string),
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> index 440db78..3f7fede 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -1953,8 +1953,23 @@ skip_vfb:
>           xlu_cfg_replace_string (config, "spice_streaming_video",
>                                   &b_info->u.hvm.spice.streaming_video, 0);
>           xlu_cfg_get_defbool(config, "nographic", &b_info->u.hvm.nographic, 0);
> -        xlu_cfg_get_defbool(config, "gfx_passthru",
> -                            &b_info->u.hvm.gfx_passthru, 0);
> +        if (!xlu_cfg_get_long(config, "gfx_passthru", &l, 1)) {
> +            if (!l) {
> +                libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);
> +            } else if (i == 1) {
> +                libxl_defbool_set(&b_info->u.hvm.gfx_passthru, true);
> +            } else {
> +                fprintf(stderr, "ERROR: invalid value %ld for \"gfx_passthru\"\n", l);
> +                exit (1);
> +            }
> +        } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
> +            if (libxl_gfx_passthru_kind_from_string(buf, &b_info->u.hvm.gfx_passthru_kind)) {
> +                fprintf(stderr, "ERROR: invalid value \"%s\" for \"gfx_passthru\"\n",
> +                        buf);
> +                exit (1);
> +            }
> +            libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);
> +        }
>           switch (xlu_cfg_get_list_as_string_list(config, "serial",
>                                                   &b_info->u.hvm.serial_list,
>                                                   1))
>
Wei Liu March 6, 2015, 12:55 p.m. UTC | #2
On Fri, Mar 06, 2015 at 05:08:23PM +0800, Tiejun Chen wrote:
> Although we already have 'gfx_passthru' in b_info, this doesn' suffice
> after we want to handle IGD specifically. Now we define a new field of
> type, gfx_passthru_kind, to indicate we're trying to pass IGD. Actually
> this means we can benefit this to support other specific devices just
> by extending gfx_passthru_kind. And then we can cooperate with
> gfx_passthru to address IGD cases as follows:
> 
>     gfx_passthru = 0    => sets build_info.u.gfx_passthru to false
>     gfx_passthru = 1    => sets build_info.u.gfx_passthru to false and
                                                               ^^^^^
                                                               true?

>                            build_info.u.gfx_passthru_kind to DEFAULT
>     gfx_passthru = "igd"    => sets build_info.u.gfx_passthru to false
>                                and build_info.u.gfx_passthru_kind to IGD
> 
> Here if gfx_passthru_kind = DEFAULT, we will call
> libxl__is_igd_vga_passthru() to check if we're hitting that table to need
> to pass that option to qemu. But if gfx_passthru_kind = "igd" we always
> force to pass that.
> 
> Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
> ---
>  tools/libxl/libxl_dm.c      | 13 +++++++++++++
>  tools/libxl/libxl_types.idl |  6 ++++++
>  tools/libxl/xl_cmdimpl.c    | 19 +++++++++++++++++--
>  3 files changed, 36 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> index 8599a6a..780dd2a 100644
> --- a/tools/libxl/libxl_dm.c
> +++ b/tools/libxl/libxl_dm.c
> @@ -757,6 +757,19 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
>                                              machinearg, max_ram_below_4g);
>              }
>          }
> +
> +        if (b_info->u.hvm.gfx_passthru_kind ==
> +                LIBXL_GFX_PASSTHRU_KIND_DEFAULT) {
> +            if (libxl__is_igd_vga_passthru(gc, guest_config)) {
> +                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
> +            }

You can remove that {} around machinearg -- it's only one line after
`if'.

> +        } else if (b_info->u.hvm.gfx_passthru_kind ==
> +                        LIBXL_GFX_PASSTHRU_KIND_IGD) {
> +                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
> +        } else {
> +            LOG(WARN, "gfx_passthru_kind is invalid so ignored.\n");
> +        }
> +
>          flexarray_append(dm_args, machinearg);
>          for (i = 0; b_info->extra_hvm && b_info->extra_hvm[i] != NULL; i++)
>              flexarray_append(dm_args, b_info->extra_hvm[i]);
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index 02be466..e209460 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -140,6 +140,11 @@ libxl_tsc_mode = Enumeration("tsc_mode", [
>      (3, "native_paravirt"),
>      ])
>  
> +libxl_gfx_passthru_kind = Enumeration("gfx_passthru_kind", [
> +    (0, "default"),
> +    (1, "igd"),
> +    ], init_val = "LIBXL_GFX_PASSTHRU_KIND_DEFAULT")
> +

You don't need to set init_val if the default value is 0.

>  # Consistent with the values defined for HVM_PARAM_TIMER_MODE.
>  libxl_timer_mode = Enumeration("timer_mode", [
>      (-1, "unknown"),
> @@ -430,6 +435,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
>                                         ("spice",            libxl_spice_info),
>                                         
>                                         ("gfx_passthru",     libxl_defbool),
> +                                       ("gfx_passthru_kind",     libxl_gfx_passthru_kind),
                                                                ^^^^
One space is enough, I think.

>                                         
>                                         ("serial",           string),
>                                         ("boot",             string),
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> index 440db78..3f7fede 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -1953,8 +1953,23 @@ skip_vfb:
>          xlu_cfg_replace_string (config, "spice_streaming_video",
>                                  &b_info->u.hvm.spice.streaming_video, 0);
>          xlu_cfg_get_defbool(config, "nographic", &b_info->u.hvm.nographic, 0);
> -        xlu_cfg_get_defbool(config, "gfx_passthru",
> -                            &b_info->u.hvm.gfx_passthru, 0);
> +        if (!xlu_cfg_get_long(config, "gfx_passthru", &l, 1)) {
> +            if (!l) {
> +                libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);
> +            } else if (i == 1) {
> +                libxl_defbool_set(&b_info->u.hvm.gfx_passthru, true);
> +            } else {
> +                fprintf(stderr, "ERROR: invalid value %ld for \"gfx_passthru\"\n", l);

Please wrap this line to be < 80 column.

> +                exit (1);
> +            }
> +        } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
> +            if (libxl_gfx_passthru_kind_from_string(buf, &b_info->u.hvm.gfx_passthru_kind)) {

Ditto.

> +                fprintf(stderr, "ERROR: invalid value \"%s\" for \"gfx_passthru\"\n",

Ditto.

Wei.

> +                        buf);
> +                exit (1);
> +            }
> +            libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);
> +        }
>          switch (xlu_cfg_get_list_as_string_list(config, "serial",
>                                                  &b_info->u.hvm.serial_list,
>                                                  1))
> -- 
> 1.9.1
Wei Liu March 6, 2015, 12:59 p.m. UTC | #3
On Fri, Mar 06, 2015 at 05:18:36PM +0800, Chen, Tiejun wrote:
> On 2015/3/6 17:08, Tiejun Chen wrote:
> >Although we already have 'gfx_passthru' in b_info, this doesn' suffice
> >after we want to handle IGD specifically. Now we define a new field of
> >type, gfx_passthru_kind, to indicate we're trying to pass IGD. Actually
> >this means we can benefit this to support other specific devices just
> >by extending gfx_passthru_kind. And then we can cooperate with
> >gfx_passthru to address IGD cases as follows:
> >
> >     gfx_passthru = 0    => sets build_info.u.gfx_passthru to false
> >     gfx_passthru = 1    => sets build_info.u.gfx_passthru to false and
> >                            build_info.u.gfx_passthru_kind to DEFAULT
> >     gfx_passthru = "igd"    => sets build_info.u.gfx_passthru to false
> >                                and build_info.u.gfx_passthru_kind to IGD
> >
> >Here if gfx_passthru_kind = DEFAULT, we will call
> >libxl__is_igd_vga_passthru() to check if we're hitting that table to need
> >to pass that option to qemu. But if gfx_passthru_kind = "igd" we always
> >force to pass that.
> >
> >Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
> >---
> >  tools/libxl/libxl_dm.c      | 13 +++++++++++++
> >  tools/libxl/libxl_types.idl |  6 ++++++
> >  tools/libxl/xl_cmdimpl.c    | 19 +++++++++++++++++--
> >  3 files changed, 36 insertions(+), 2 deletions(-)
> >
> >diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> >index 8599a6a..780dd2a 100644
> >--- a/tools/libxl/libxl_dm.c
> >+++ b/tools/libxl/libxl_dm.c
> 
> Sorry, looks I'm missing to remove '-gfx_passthru' since this should be gone
> in the case of qemu upstream,
> 
> @@ -710,9 +710,6 @@ static char **
> libxl__build_device_model_args_new(libxl__gc *gc,
>              flexarray_append(dm_args, "-net");
>              flexarray_append(dm_args, "none");
>          }
> -        if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
> -            flexarray_append(dm_args, "-gfx_passthru");
> -        }
>      } else {
>          if (!sdl && !vnc) {
>              flexarray_append(dm_args, "-nographic");
> 
> I will fold this into next revision after this review.
> 

I think this change alone warrants a separate changeset. It should be
patch 0 of your series as a preparatory patch. Please remember to
elaborate in commit message why that hunk is not needed in upstream
QEMU.

Wei.
Tiejun Chen March 9, 2015, 6:45 a.m. UTC | #4
On 2015/3/6 20:55, Wei Liu wrote:
> On Fri, Mar 06, 2015 at 05:08:23PM +0800, Tiejun Chen wrote:
>> Although we already have 'gfx_passthru' in b_info, this doesn' suffice
>> after we want to handle IGD specifically. Now we define a new field of
>> type, gfx_passthru_kind, to indicate we're trying to pass IGD. Actually
>> this means we can benefit this to support other specific devices just
>> by extending gfx_passthru_kind. And then we can cooperate with
>> gfx_passthru to address IGD cases as follows:
>>
>>      gfx_passthru = 0    => sets build_info.u.gfx_passthru to false
>>      gfx_passthru = 1    => sets build_info.u.gfx_passthru to false and
>                                                                 ^^^^^
>                                                                 true?

I just simply pick up this from Campbell's comment but I agree you.

>
>>                             build_info.u.gfx_passthru_kind to DEFAULT
>>      gfx_passthru = "igd"    => sets build_info.u.gfx_passthru to false
>>                                 and build_info.u.gfx_passthru_kind to IGD
>>
>> Here if gfx_passthru_kind = DEFAULT, we will call
>> libxl__is_igd_vga_passthru() to check if we're hitting that table to need
>> to pass that option to qemu. But if gfx_passthru_kind = "igd" we always
>> force to pass that.
>>
>> Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
>> ---
>>   tools/libxl/libxl_dm.c      | 13 +++++++++++++
>>   tools/libxl/libxl_types.idl |  6 ++++++
>>   tools/libxl/xl_cmdimpl.c    | 19 +++++++++++++++++--
>>   3 files changed, 36 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
>> index 8599a6a..780dd2a 100644
>> --- a/tools/libxl/libxl_dm.c
>> +++ b/tools/libxl/libxl_dm.c
>> @@ -757,6 +757,19 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
>>                                               machinearg, max_ram_below_4g);
>>               }
>>           }
>> +
>> +        if (b_info->u.hvm.gfx_passthru_kind ==
>> +                LIBXL_GFX_PASSTHRU_KIND_DEFAULT) {
>> +            if (libxl__is_igd_vga_passthru(gc, guest_config)) {
>> +                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
>> +            }
>
> You can remove that {} around machinearg -- it's only one line after
> `if'.

Okay.

>
>> +        } else if (b_info->u.hvm.gfx_passthru_kind ==
>> +                        LIBXL_GFX_PASSTHRU_KIND_IGD) {
>> +                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
>> +        } else {
>> +            LOG(WARN, "gfx_passthru_kind is invalid so ignored.\n");
>> +        }
>> +
>>           flexarray_append(dm_args, machinearg);
>>           for (i = 0; b_info->extra_hvm && b_info->extra_hvm[i] != NULL; i++)
>>               flexarray_append(dm_args, b_info->extra_hvm[i]);
>> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
>> index 02be466..e209460 100644
>> --- a/tools/libxl/libxl_types.idl
>> +++ b/tools/libxl/libxl_types.idl
>> @@ -140,6 +140,11 @@ libxl_tsc_mode = Enumeration("tsc_mode", [
>>       (3, "native_paravirt"),
>>       ])
>>
>> +libxl_gfx_passthru_kind = Enumeration("gfx_passthru_kind", [
>> +    (0, "default"),
>> +    (1, "igd"),
>> +    ], init_val = "LIBXL_GFX_PASSTHRU_KIND_DEFAULT")
>> +
>
> You don't need to set init_val if the default value is 0.

Got it.

>
>>   # Consistent with the values defined for HVM_PARAM_TIMER_MODE.
>>   libxl_timer_mode = Enumeration("timer_mode", [
>>       (-1, "unknown"),
>> @@ -430,6 +435,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
>>                                          ("spice",            libxl_spice_info),
>>
>>                                          ("gfx_passthru",     libxl_defbool),
>> +                                       ("gfx_passthru_kind",     libxl_gfx_passthru_kind),
>                                                                  ^^^^
> One space is enough, I think.

Okay.

>
>>
>>                                          ("serial",           string),
>>                                          ("boot",             string),
>> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
>> index 440db78..3f7fede 100644
>> --- a/tools/libxl/xl_cmdimpl.c
>> +++ b/tools/libxl/xl_cmdimpl.c
>> @@ -1953,8 +1953,23 @@ skip_vfb:
>>           xlu_cfg_replace_string (config, "spice_streaming_video",
>>                                   &b_info->u.hvm.spice.streaming_video, 0);
>>           xlu_cfg_get_defbool(config, "nographic", &b_info->u.hvm.nographic, 0);
>> -        xlu_cfg_get_defbool(config, "gfx_passthru",
>> -                            &b_info->u.hvm.gfx_passthru, 0);
>> +        if (!xlu_cfg_get_long(config, "gfx_passthru", &l, 1)) {
>> +            if (!l) {
>> +                libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);
>> +            } else if (i == 1) {
>> +                libxl_defbool_set(&b_info->u.hvm.gfx_passthru, true);
>> +            } else {
>> +                fprintf(stderr, "ERROR: invalid value %ld for \"gfx_passthru\"\n", l);
>
> Please wrap this line to be < 80 column.
>
>> +                exit (1);
>> +            }
>> +        } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
>> +            if (libxl_gfx_passthru_kind_from_string(buf, &b_info->u.hvm.gfx_passthru_kind)) {
>
> Ditto.
>
>> +                fprintf(stderr, "ERROR: invalid value \"%s\" for \"gfx_passthru\"\n",
>
> Ditto.

So,

@@ -1959,13 +1959,15 @@ skip_vfb:
              } else if (i == 1) {
                  libxl_defbool_set(&b_info->u.hvm.gfx_passthru, true);
              } else {
-                fprintf(stderr, "ERROR: invalid value %ld for 
\"gfx_passthru\"\n", l);
+                fprintf(stderr, "ERROR: invalid value %ld for"
+                                " \"gfx_passthru\"\n", l);
                  exit (1);
              }
          } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
-            if (libxl_gfx_passthru_kind_from_string(buf, 
&b_info->u.hvm.gfx_passthru_kind)) {
-                fprintf(stderr, "ERROR: invalid value \"%s\" for 
\"gfx_passthru\"\n",
-                        buf);
+            if (libxl_gfx_passthru_kind_from_string(buf,
+ 
&b_info->u.hvm.gfx_passthru_kind)) {
+                fprintf(stderr, "ERROR: invalid value \"%s\" for"
+                                " \"gfx_passthru\"\n", buf);
                  exit (1);
              }
              libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);

Thanks
Tiejun
Tiejun Chen March 9, 2015, 6:50 a.m. UTC | #5
On 2015/3/6 20:59, Wei Liu wrote:
> On Fri, Mar 06, 2015 at 05:18:36PM +0800, Chen, Tiejun wrote:
>> On 2015/3/6 17:08, Tiejun Chen wrote:
>>> Although we already have 'gfx_passthru' in b_info, this doesn' suffice
>>> after we want to handle IGD specifically. Now we define a new field of
>>> type, gfx_passthru_kind, to indicate we're trying to pass IGD. Actually
>>> this means we can benefit this to support other specific devices just
>>> by extending gfx_passthru_kind. And then we can cooperate with
>>> gfx_passthru to address IGD cases as follows:
>>>
>>>      gfx_passthru = 0    => sets build_info.u.gfx_passthru to false
>>>      gfx_passthru = 1    => sets build_info.u.gfx_passthru to false and
>>>                             build_info.u.gfx_passthru_kind to DEFAULT
>>>      gfx_passthru = "igd"    => sets build_info.u.gfx_passthru to false
>>>                                 and build_info.u.gfx_passthru_kind to IGD
>>>
>>> Here if gfx_passthru_kind = DEFAULT, we will call
>>> libxl__is_igd_vga_passthru() to check if we're hitting that table to need
>>> to pass that option to qemu. But if gfx_passthru_kind = "igd" we always
>>> force to pass that.
>>>
>>> Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
>>> ---
>>>   tools/libxl/libxl_dm.c      | 13 +++++++++++++
>>>   tools/libxl/libxl_types.idl |  6 ++++++
>>>   tools/libxl/xl_cmdimpl.c    | 19 +++++++++++++++++--
>>>   3 files changed, 36 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
>>> index 8599a6a..780dd2a 100644
>>> --- a/tools/libxl/libxl_dm.c
>>> +++ b/tools/libxl/libxl_dm.c
>>
>> Sorry, looks I'm missing to remove '-gfx_passthru' since this should be gone
>> in the case of qemu upstream,
>>
>> @@ -710,9 +710,6 @@ static char **
>> libxl__build_device_model_args_new(libxl__gc *gc,
>>               flexarray_append(dm_args, "-net");
>>               flexarray_append(dm_args, "none");
>>           }
>> -        if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
>> -            flexarray_append(dm_args, "-gfx_passthru");
>> -        }
>>       } else {
>>           if (!sdl && !vnc) {
>>               flexarray_append(dm_args, "-nographic");
>>
>> I will fold this into next revision after this review.
>>
>
> I think this change alone warrants a separate changeset. It should be
> patch 0 of your series as a preparatory patch. Please remember to
> elaborate in commit message why that hunk is not needed in upstream
> QEMU.
>

What about this?

"-gfx_passthru" is just introduced to work for qemu-xen-traditional so 
we should get this away from libxl__build_device_model_args_new() in the 
case of qemu upstream.

Thanks
Tiejun
Wei Liu March 9, 2015, 10:13 a.m. UTC | #6
On Mon, Mar 09, 2015 at 02:50:42PM +0800, Chen, Tiejun wrote:
> On 2015/3/6 20:59, Wei Liu wrote:
> >On Fri, Mar 06, 2015 at 05:18:36PM +0800, Chen, Tiejun wrote:
> >>On 2015/3/6 17:08, Tiejun Chen wrote:
> >>>Although we already have 'gfx_passthru' in b_info, this doesn' suffice
> >>>after we want to handle IGD specifically. Now we define a new field of
> >>>type, gfx_passthru_kind, to indicate we're trying to pass IGD. Actually
> >>>this means we can benefit this to support other specific devices just
> >>>by extending gfx_passthru_kind. And then we can cooperate with
> >>>gfx_passthru to address IGD cases as follows:
> >>>
> >>>     gfx_passthru = 0    => sets build_info.u.gfx_passthru to false
> >>>     gfx_passthru = 1    => sets build_info.u.gfx_passthru to false and
> >>>                            build_info.u.gfx_passthru_kind to DEFAULT
> >>>     gfx_passthru = "igd"    => sets build_info.u.gfx_passthru to false
> >>>                                and build_info.u.gfx_passthru_kind to IGD
> >>>
> >>>Here if gfx_passthru_kind = DEFAULT, we will call
> >>>libxl__is_igd_vga_passthru() to check if we're hitting that table to need
> >>>to pass that option to qemu. But if gfx_passthru_kind = "igd" we always
> >>>force to pass that.
> >>>
> >>>Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
> >>>---
> >>>  tools/libxl/libxl_dm.c      | 13 +++++++++++++
> >>>  tools/libxl/libxl_types.idl |  6 ++++++
> >>>  tools/libxl/xl_cmdimpl.c    | 19 +++++++++++++++++--
> >>>  3 files changed, 36 insertions(+), 2 deletions(-)
> >>>
> >>>diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> >>>index 8599a6a..780dd2a 100644
> >>>--- a/tools/libxl/libxl_dm.c
> >>>+++ b/tools/libxl/libxl_dm.c
> >>
> >>Sorry, looks I'm missing to remove '-gfx_passthru' since this should be gone
> >>in the case of qemu upstream,
> >>
> >>@@ -710,9 +710,6 @@ static char **
> >>libxl__build_device_model_args_new(libxl__gc *gc,
> >>              flexarray_append(dm_args, "-net");
> >>              flexarray_append(dm_args, "none");
> >>          }
> >>-        if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
> >>-            flexarray_append(dm_args, "-gfx_passthru");
> >>-        }
> >>      } else {
> >>          if (!sdl && !vnc) {
> >>              flexarray_append(dm_args, "-nographic");
> >>
> >>I will fold this into next revision after this review.
> >>
> >
> >I think this change alone warrants a separate changeset. It should be
> >patch 0 of your series as a preparatory patch. Please remember to
> >elaborate in commit message why that hunk is not needed in upstream
> >QEMU.
> >
> 
> What about this?
> 
> "-gfx_passthru" is just introduced to work for qemu-xen-traditional so we
> should get this away from libxl__build_device_model_args_new() in the case
> of qemu upstream.
> 

This looks good.

Wei.

> Thanks
> Tiejun
Wei Liu March 9, 2015, 10:17 a.m. UTC | #7
On Mon, Mar 09, 2015 at 02:45:36PM +0800, Chen, Tiejun wrote:
[...]
> >
> >>+                exit (1);
> >>+            }
> >>+        } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
> >>+            if (libxl_gfx_passthru_kind_from_string(buf, &b_info->u.hvm.gfx_passthru_kind)) {
> >
> >Ditto.
> >
> >>+                fprintf(stderr, "ERROR: invalid value \"%s\" for \"gfx_passthru\"\n",
> >
> >Ditto.
> 
> So,
> 
> @@ -1959,13 +1959,15 @@ skip_vfb:
>              } else if (i == 1) {
>                  libxl_defbool_set(&b_info->u.hvm.gfx_passthru, true);
>              } else {
> -                fprintf(stderr, "ERROR: invalid value %ld for
> \"gfx_passthru\"\n", l);
> +                fprintf(stderr, "ERROR: invalid value %ld for"
> +                                " \"gfx_passthru\"\n", l);
>                  exit (1);
>              }
>          } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
> -            if (libxl_gfx_passthru_kind_from_string(buf,
> &b_info->u.hvm.gfx_passthru_kind)) {
> -                fprintf(stderr, "ERROR: invalid value \"%s\" for
> \"gfx_passthru\"\n",
> -                        buf);
> +            if (libxl_gfx_passthru_kind_from_string(buf,
> + &b_info->u.hvm.gfx_passthru_kind)) {
> +                fprintf(stderr, "ERROR: invalid value \"%s\" for"
> +                                " \"gfx_passthru\"\n", buf);
>                  exit (1);
>              }
>              libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);
> 

Your changes are mangled by your email client. But we don't normally
split the format string so that it's easier to grep.

What we normally do is 

     fprintf(stderr,
             "FORMAT STRING",
	     a, b, c);

If format string still treads over 80 column it's fine. We can live
with that.

Wei.

> Thanks
> Tiejun
Tiejun Chen March 10, 2015, 12:28 a.m. UTC | #8
On 2015/3/9 18:17, Wei Liu wrote:
> On Mon, Mar 09, 2015 at 02:45:36PM +0800, Chen, Tiejun wrote:
> [...]
>>>
>>>> +                exit (1);
>>>> +            }
>>>> +        } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
>>>> +            if (libxl_gfx_passthru_kind_from_string(buf, &b_info->u.hvm.gfx_passthru_kind)) {
>>>
>>> Ditto.
>>>
>>>> +                fprintf(stderr, "ERROR: invalid value \"%s\" for \"gfx_passthru\"\n",
>>>
>>> Ditto.
>>
>> So,
>>
>> @@ -1959,13 +1959,15 @@ skip_vfb:
>>               } else if (i == 1) {
>>                   libxl_defbool_set(&b_info->u.hvm.gfx_passthru, true);
>>               } else {
>> -                fprintf(stderr, "ERROR: invalid value %ld for
>> \"gfx_passthru\"\n", l);
>> +                fprintf(stderr, "ERROR: invalid value %ld for"
>> +                                " \"gfx_passthru\"\n", l);
>>                   exit (1);
>>               }
>>           } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
>> -            if (libxl_gfx_passthru_kind_from_string(buf,
>> &b_info->u.hvm.gfx_passthru_kind)) {
>> -                fprintf(stderr, "ERROR: invalid value \"%s\" for
>> \"gfx_passthru\"\n",
>> -                        buf);
>> +            if (libxl_gfx_passthru_kind_from_string(buf,
>> + &b_info->u.hvm.gfx_passthru_kind)) {
>> +                fprintf(stderr, "ERROR: invalid value \"%s\" for"
>> +                                " \"gfx_passthru\"\n", buf);
>>                   exit (1);
>>               }
>>               libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);
>>
>
> Your changes are mangled by your email client. But we don't normally
> split the format string so that it's easier to grep.

Yeah.

>
> What we normally do is
>
>       fprintf(stderr,
>               "FORMAT STRING",
> 	     a, b, c);
>
> If format string still treads over 80 column it's fine. We can live
> with that.
>

Understood.

Thanks
Tiejun
Ian Campbell March 11, 2015, 11:23 a.m. UTC | #9
On Mon, 2015-03-09 at 14:45 +0800, Chen, Tiejun wrote:
> On 2015/3/6 20:55, Wei Liu wrote:
> > On Fri, Mar 06, 2015 at 05:08:23PM +0800, Tiejun Chen wrote:
> >> Although we already have 'gfx_passthru' in b_info, this doesn' suffice
                                                                   ^t

> >> after we want to handle IGD specifically. Now we define a new field of
> >> type, gfx_passthru_kind, to indicate we're trying to pass IGD. Actually
> >> this means we can benefit this to support other specific devices just
> >> by extending gfx_passthru_kind. And then we can cooperate with
> >> gfx_passthru to address IGD cases as follows:
> >>
> >>      gfx_passthru = 0    => sets build_info.u.gfx_passthru to false
> >>      gfx_passthru = 1    => sets build_info.u.gfx_passthru to false and
> >                                                                 ^^^^^
> >                                                                 true?
> 
> I just simply pick up this from Campbell's comment but I agree you.

Sorry! Wei is right.
diff mbox

Patch

diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 8599a6a..780dd2a 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -757,6 +757,19 @@  static char ** libxl__build_device_model_args_new(libxl__gc *gc,
                                             machinearg, max_ram_below_4g);
             }
         }
+
+        if (b_info->u.hvm.gfx_passthru_kind ==
+                LIBXL_GFX_PASSTHRU_KIND_DEFAULT) {
+            if (libxl__is_igd_vga_passthru(gc, guest_config)) {
+                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
+            }
+        } else if (b_info->u.hvm.gfx_passthru_kind ==
+                        LIBXL_GFX_PASSTHRU_KIND_IGD) {
+                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
+        } else {
+            LOG(WARN, "gfx_passthru_kind is invalid so ignored.\n");
+        }
+
         flexarray_append(dm_args, machinearg);
         for (i = 0; b_info->extra_hvm && b_info->extra_hvm[i] != NULL; i++)
             flexarray_append(dm_args, b_info->extra_hvm[i]);
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 02be466..e209460 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -140,6 +140,11 @@  libxl_tsc_mode = Enumeration("tsc_mode", [
     (3, "native_paravirt"),
     ])
 
+libxl_gfx_passthru_kind = Enumeration("gfx_passthru_kind", [
+    (0, "default"),
+    (1, "igd"),
+    ], init_val = "LIBXL_GFX_PASSTHRU_KIND_DEFAULT")
+
 # Consistent with the values defined for HVM_PARAM_TIMER_MODE.
 libxl_timer_mode = Enumeration("timer_mode", [
     (-1, "unknown"),
@@ -430,6 +435,7 @@  libxl_domain_build_info = Struct("domain_build_info",[
                                        ("spice",            libxl_spice_info),
                                        
                                        ("gfx_passthru",     libxl_defbool),
+                                       ("gfx_passthru_kind",     libxl_gfx_passthru_kind),
                                        
                                        ("serial",           string),
                                        ("boot",             string),
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 440db78..3f7fede 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -1953,8 +1953,23 @@  skip_vfb:
         xlu_cfg_replace_string (config, "spice_streaming_video",
                                 &b_info->u.hvm.spice.streaming_video, 0);
         xlu_cfg_get_defbool(config, "nographic", &b_info->u.hvm.nographic, 0);
-        xlu_cfg_get_defbool(config, "gfx_passthru",
-                            &b_info->u.hvm.gfx_passthru, 0);
+        if (!xlu_cfg_get_long(config, "gfx_passthru", &l, 1)) {
+            if (!l) {
+                libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);
+            } else if (i == 1) {
+                libxl_defbool_set(&b_info->u.hvm.gfx_passthru, true);
+            } else {
+                fprintf(stderr, "ERROR: invalid value %ld for \"gfx_passthru\"\n", l);
+                exit (1);
+            }
+        } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
+            if (libxl_gfx_passthru_kind_from_string(buf, &b_info->u.hvm.gfx_passthru_kind)) {
+                fprintf(stderr, "ERROR: invalid value \"%s\" for \"gfx_passthru\"\n",
+                        buf);
+                exit (1);
+            }
+            libxl_defbool_set(&b_info->u.hvm.gfx_passthru, false);
+        }
         switch (xlu_cfg_get_list_as_string_list(config, "serial",
                                                 &b_info->u.hvm.serial_list,
                                                 1))