diff mbox

[v2,2/2] libxl: introduce gfx_passthru_kind

Message ID 550B7207.6020503@intel.com
State New
Headers show

Commit Message

Tiejun Chen March 20, 2015, 1:04 a.m. UTC
On 2015/3/19 18:44, Ian Campbell wrote:
> On Thu, 2015-03-19 at 10:07 +0800, Chen, Tiejun wrote:
>>> This duplicates the code from above. I think this would be best done as:
>>>
>>> static int libxl__detect_gfx_passthru_kind(libxl__gc *gc, guest_config)
>>> {
>>>       if (b_info->u.hvm.gfx_passthru_kind != LIBXL_GFX_PASSTHRU_KIND_DEFAULT)
>>>           return 0;
>>>
>>>       if (libxl__is_igd_vga_passthru(gc, guest_config)) {
>>>           b_info->u.hvm.gfx_passthru_kind = LIBXL_GFX_PASSTHRU_KIND_IGD;
>>>           return 0;
>>>       }
>>>
>>>       LOG(ERROR, "Unable to detect graphics passthru kind");
>>>       return 1;
>>> }
>>>
>>> Then for the code in libxl__build_device_model_args_new:
>>>
>>>            if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
>>>                if (!libxl__detect_gfx_passthru_kind(gc, guest_config))
>>>                     return NULL
>>>                switch (b_info->u.hvm.gfx_passthru_kind) {
>>>                case LIBXL_GFX_PASSTHRU_KIND_IGD:
>>>                    machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
>>>                    break;
>>>                default:
>>>                    LOG(ERROR, "unknown gfx_passthru_kind\n");
>>>                   return NULL;
>>>                }
>>>           }
>>>
>>> That is, a helper to try and autodetect kind if it is default and then a
>>> single switch entry for each kind.
>>>
>>>> +            default:
>>>> +                LOG(WARN, "gfx_passthru_kind is invalid so ignored.\n");
>>>
>>> Please return an error here, as I've shown above.
>>
>> Looks good and thanks, but here 'guest_config' is a const so we
>> shouldn't/can't reset b_info->u.hvm.gfx_passthru_kind like this,
>>
>> b_info->u.hvm.gfx_passthru_kind = LIBXL_GFX_PASSTHRU_KIND_IGD;
>>
>> So I tried to refactor a little bit to follow up yours,
>>
>> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
>> index 8599a6a..605b17c 100644
>> --- a/tools/libxl/libxl_dm.c
>> +++ b/tools/libxl/libxl_dm.c
>> @@ -409,6 +409,23 @@ static char *dm_spice_options(libxl__gc *gc,
>>        return opt;
>>    }
>>
>> +static int
>> +libxl__detect_gfx_passthru_kind(libxl__gc *gc,
>> +                                const libxl_domain_config *guest_config)
>> +{
>> +    const libxl_domain_build_info *b_info = &guest_config->b_info;
>> +
>> +    if (b_info->u.hvm.gfx_passthru_kind != LIBXL_GFX_PASSTHRU_KIND_DEFAULT)
>> +        return b_info->u.hvm.gfx_passthru_kind;
>> +
>> +    if (libxl__is_igd_vga_passthru(gc, guest_config)) {
>> +        return LIBXL_GFX_PASSTHRU_KIND_IGD;
>> +    }
>> +
>> +    LOG(ERROR, "Unable to detect graphics passthru kind");
>> +    return -1;
>
> I think you can make this function return enum
> libxl_gfx_passthrough_kind and then return
> LIBXL_GFX_PASSTHRU_KIND_DEFAULT in this case.
>
>> +}
>> +
>>    static char ** libxl__build_device_model_args_new(libxl__gc *gc,
>>                                            const char *dm, int guest_domid,
>>                                            const libxl_domain_config
>> *guest_config,
>> @@ -427,7 +444,7 @@ static char **
>> libxl__build_device_model_args_new(libxl__gc *gc,
>>        const char *keymap = dm_keymap(guest_config);
>>        char *machinearg;
>>        flexarray_t *dm_args;
>> -    int i, connection, devid;
>> +    int i, connection, devid, gfx_passthru_kind;
>
> Please declare this in the smallest necessary scope...
> [...]
>> +        if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
>> +            gfx_passthru_kind = libxl__detect_gfx_passthru_kind(gc,
>
> i.e. here.
>
>> +
>> guest_config);
>> +            switch (gfx_passthru_kind) {
>> +            case LIBXL_GFX_PASSTHRU_KIND_IGD:
>> +                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
>> +                break;
>> +            default:
>
> With the suggestion to return KIND_DEFAULT if detection fails then I
> think an extra case should be added:
>          case LIBXL_GFX_PASSTHRU_KIND_DEFAULT:
>                  LOG(ERROR, "unable to detect required
>                  gfx_passthru_kind");
>                  return NULL;
>
>> +                LOG(ERROR, "unknown gfx_passthru_kind\n");
>
> I think LOG is supposed to not include the final \n.
>

Refactor again,

*guest_config,
@@ -757,6 +771,21 @@ static char ** 
libxl__build_device_model_args_new(libxl__gc *gc,
                                              machinearg, max_ram_below_4g);
              }
          }
+
+        if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
+            enum libxl_gfx_passthru_kind gfx_passthru_kind =
+                            libxl__detect_gfx_passthru_kind(gc, 
guest_config);
+            switch (gfx_passthru_kind) {
+            case LIBXL_GFX_PASSTHRU_KIND_IGD:
+                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
+                break;
+            case LIBXL_GFX_PASSTHRU_KIND_DEFAULT:
+                LOG(ERROR, "unable to detect required gfx_passthru_kind");
+            default:
+                return NULL;
+            }
+        }
+
          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]);


Thanks
Tiejun

Comments

Ian Campbell March 20, 2015, 9:40 a.m. UTC | #1
On Fri, 2015-03-20 at 09:04 +0800, Chen, Tiejun wrote:
> Refactor again,
> 
> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> index 8599a6a..05c8916 100644
> --- a/tools/libxl/libxl_dm.c
> +++ b/tools/libxl/libxl_dm.c
> @@ -409,6 +409,23 @@ static char *dm_spice_options(libxl__gc *gc,
>       return opt;
>   }
> 
> +static enum libxl_gfx_passthru_kind
> +libxl__detect_gfx_passthru_kind(libxl__gc *gc,
> +                                const libxl_domain_config *guest_config)
> +{
> +    const libxl_domain_build_info *b_info = &guest_config->b_info;
> +
> +    if (b_info->u.hvm.gfx_passthru_kind != LIBXL_GFX_PASSTHRU_KIND_DEFAULT)
> +        return b_info->u.hvm.gfx_passthru_kind;
> +
> +    if (libxl__is_igd_vga_passthru(gc, guest_config)) {
> +        return LIBXL_GFX_PASSTHRU_KIND_IGD;
> +    }
> +
> +    LOG(ERROR, "Unable to detect graphics passthru kind");
> +    return LIBXL_GFX_PASSTHRU_KIND_DEFAULT;
> +}
> +
>   static char ** libxl__build_device_model_args_new(libxl__gc *gc,
>                                           const char *dm, int guest_domid,
>                                           const libxl_domain_config 
> *guest_config,
> @@ -757,6 +771,21 @@ static char ** 
> libxl__build_device_model_args_new(libxl__gc *gc,
>                                               machinearg, max_ram_below_4g);
>               }
>           }
> +
> +        if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
> +            enum libxl_gfx_passthru_kind gfx_passthru_kind =
> +                            libxl__detect_gfx_passthru_kind(gc, 
> guest_config);
> +            switch (gfx_passthru_kind) {
> +            case LIBXL_GFX_PASSTHRU_KIND_IGD:
> +                machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
> +                break;
> +            case LIBXL_GFX_PASSTHRU_KIND_DEFAULT:
> +                LOG(ERROR, "unable to detect required gfx_passthru_kind");

In this case you will now have logged twice. I'd suggest logging only
here and not in the helper.

> +            default:

And this case is subtly different to LIBXL_GFX_PASSTHRU_KIND_DEFAULT
since it would indicate some sort of corruption. So, I would drop the
logging on failure in libxl__detect_gfx_passthru_kind and here do:
           case LIBXL_GFX_PASSTHRU_KIND_DEFAULT:
               LOG(ERROR, "unable to detect required gfx_passthru_kind");
               return NULL;
           default:
               LOG(ERROR, "invalid value for gfx_passthru_kind");
               return NULL;

Ian
diff mbox

Patch

diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 8599a6a..05c8916 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -409,6 +409,23 @@  static char *dm_spice_options(libxl__gc *gc,
      return opt;
  }

+static enum libxl_gfx_passthru_kind
+libxl__detect_gfx_passthru_kind(libxl__gc *gc,
+                                const libxl_domain_config *guest_config)
+{
+    const libxl_domain_build_info *b_info = &guest_config->b_info;
+
+    if (b_info->u.hvm.gfx_passthru_kind != LIBXL_GFX_PASSTHRU_KIND_DEFAULT)
+        return b_info->u.hvm.gfx_passthru_kind;
+
+    if (libxl__is_igd_vga_passthru(gc, guest_config)) {
+        return LIBXL_GFX_PASSTHRU_KIND_IGD;
+    }
+
+    LOG(ERROR, "Unable to detect graphics passthru kind");
+    return LIBXL_GFX_PASSTHRU_KIND_DEFAULT;
+}
+
  static char ** libxl__build_device_model_args_new(libxl__gc *gc,
                                          const char *dm, int guest_domid,
                                          const libxl_domain_config