Skip to content
Snippets Groups Projects
  1. Dec 18, 2020
  2. Dec 15, 2020
  3. Nov 17, 2020
  4. Nov 15, 2020
  5. Oct 27, 2020
  6. Oct 13, 2020
  7. Sep 22, 2020
  8. Sep 18, 2020
  9. Sep 16, 2020
  10. Sep 09, 2020
  11. Aug 21, 2020
  12. Jul 24, 2020
    • Stefan Berger's avatar
      tpm_emulator: Report an error if chardev is missing · 88f83074
      Stefan Berger authored
      
      This patch fixes the odd error reporting when trying to send a file
      descriptor to the TPM emulator if one has not passed a valid chardev.
      
      $ x86_64-softmmu/qemu-system-x86_64 -tpmdev emulator,id=tpm0
      qemu-system-x86_64: -tpmdev emulator,id=tpm0: tpm-emulator: Failed to send CMD_SET_DATAFD: Success
      qemu-system-x86_64: -tpmdev emulator,id=tpm0: tpm-emulator: Could not cleanly shutdown the TPM: Success
      
      This is the new error report:
      
      $ x86_64-softmmu/qemu-system-x86_64 -tpmdev emulator,id=tpm0
      qemu-system-x86_64: -tpmdev emulator,id=tpm0: tpm-emulator: parameter 'chardev' is missing
      
      This change does not hide the display of supported TPM types if a non-existent type is passed:
      
      $ x86_64-softmmu/qemu-system-x86_64 -tpmdev nonexistent,id=tpm0
      qemu-system-x86_64: -tpmdev nonexistent,id=tpm0: Parameter 'type' expects a TPM backend type
      Supported TPM types (choose only one):
       passthrough   Passthrough TPM backend driver
          emulator   TPM emulator backend driver
      
      Signed-off-by: default avatarStefan Berger <stefanb@linux.ibm.com>
      Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
      Reviewed-by: default avatarMarkus Armbruster <armbru@redhat.com>
      88f83074
  13. Jul 21, 2020
  14. Jul 10, 2020
    • Markus Armbruster's avatar
      error: Eliminate error_propagate() with Coccinelle, part 1 · 668f62ec
      Markus Armbruster authored
      
      When all we do with an Error we receive into a local variable is
      propagating to somewhere else, we can just as well receive it there
      right away.  Convert
      
          if (!foo(..., &err)) {
              ...
              error_propagate(errp, err);
              ...
              return ...
          }
      
      to
      
          if (!foo(..., errp)) {
              ...
              ...
              return ...
          }
      
      where nothing else needs @err.  Coccinelle script:
      
          @rule1 forall@
          identifier fun, err, errp, lbl;
          expression list args, args2;
          binary operator op;
          constant c1, c2;
          symbol false;
          @@
               if (
          (
          -        fun(args, &err, args2)
          +        fun(args, errp, args2)
          |
          -        !fun(args, &err, args2)
          +        !fun(args, errp, args2)
          |
          -        fun(args, &err, args2) op c1
          +        fun(args, errp, args2) op c1
          )
                  )
               {
                   ... when != err
                       when != lbl:
                       when strict
          -        error_propagate(errp, err);
                   ... when != err
          (
                   return;
          |
                   return c2;
          |
                   return false;
          )
               }
      
          @rule2 forall@
          identifier fun, err, errp, lbl;
          expression list args, args2;
          expression var;
          binary operator op;
          constant c1, c2;
          symbol false;
          @@
          -    var = fun(args, &err, args2);
          +    var = fun(args, errp, args2);
               ... when != err
               if (
          (
                   var
          |
                   !var
          |
                   var op c1
          )
                  )
               {
                   ... when != err
                       when != lbl:
                       when strict
          -        error_propagate(errp, err);
                   ... when != err
          (
                   return;
          |
                   return c2;
          |
                   return false;
          |
                   return var;
          )
               }
      
          @depends on rule1 || rule2@
          identifier err;
          @@
          -    Error *err = NULL;
               ... when != err
      
      Not exactly elegant, I'm afraid.
      
      The "when != lbl:" is necessary to avoid transforming
      
               if (fun(args, &err)) {
                   goto out
               }
               ...
           out:
               error_propagate(errp, err);
      
      even though other paths to label out still need the error_propagate().
      For an actual example, see sclp_realize().
      
      Without the "when strict", Coccinelle transforms vfio_msix_setup(),
      incorrectly.  I don't know what exactly "when strict" does, only that
      it helps here.
      
      The match of return is narrower than what I want, but I can't figure
      out how to express "return where the operand doesn't use @err".  For
      an example where it's too narrow, see vfio_intx_enable().
      
      Silently fails to convert hw/arm/armsse.c, because Coccinelle gets
      confused by ARMSSE being used both as typedef and function-like macro
      there.  Converted manually.
      
      Line breaks tidied up manually.  One nested declaration of @local_err
      deleted manually.  Preexisting unwanted blank line dropped in
      hw/riscv/sifive_e.c.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <20200707160613.848843-35-armbru@redhat.com>
      668f62ec
    • Markus Armbruster's avatar
      error: Avoid unnecessary error_propagate() after error_setg() · dcfe4805
      Markus Armbruster authored
      
      Replace
      
          error_setg(&err, ...);
          error_propagate(errp, err);
      
      by
      
          error_setg(errp, ...);
      
      Related pattern:
      
          if (...) {
              error_setg(&err, ...);
              goto out;
          }
          ...
       out:
          error_propagate(errp, err);
          return;
      
      When all paths to label out are that way, replace by
      
          if (...) {
              error_setg(errp, ...);
              return;
          }
      
      and delete the label along with the error_propagate().
      
      When we have at most one other path that actually needs to propagate,
      and maybe one at the end that where propagation is unnecessary, e.g.
      
          foo(..., &err);
          if (err) {
              goto out;
          }
          ...
          bar(..., &err);
       out:
          error_propagate(errp, err);
          return;
      
      move the error_propagate() to where it's needed, like
      
          if (...) {
              foo(..., &err);
              error_propagate(errp, err);
              return;
          }
          ...
          bar(..., errp);
          return;
      
      and transform the error_setg() as above.
      
      In some places, the transformation results in obviously unnecessary
      error_propagate().  The next few commits will eliminate them.
      
      Bonus: the elimination of gotos will make later patches in this series
      easier to review.
      
      Candidates for conversion tracked down with this Coccinelle script:
      
          @@
          identifier err, errp;
          expression list args;
          @@
          -    error_setg(&err, args);
          +    error_setg(errp, args);
               ... when != err
               error_propagate(errp, err);
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <20200707160613.848843-34-armbru@redhat.com>
      dcfe4805
    • Markus Armbruster's avatar
      qom: Put name parameter before value / visitor parameter · 5325cc34
      Markus Armbruster authored
      
      The object_property_set_FOO() setters take property name and value in
      an unusual order:
      
          void object_property_set_FOO(Object *obj, FOO_TYPE value,
                                       const char *name, Error **errp)
      
      Having to pass value before name feels grating.  Swap them.
      
      Same for object_property_set(), object_property_get(), and
      object_property_parse().
      
      Convert callers with this Coccinelle script:
      
          @@
          identifier fun = {
              object_property_get, object_property_parse, object_property_set_str,
              object_property_set_link, object_property_set_bool,
              object_property_set_int, object_property_set_uint, object_property_set,
              object_property_set_qobject
          };
          expression obj, v, name, errp;
          @@
          -    fun(obj, v, name, errp)
          +    fun(obj, name, v, errp)
      
      Chokes on hw/arm/musicpal.c's lcd_refresh() with the unhelpful error
      message "no position information".  Convert that one manually.
      
      Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
      ARMSSE being used both as typedef and function-like macro there.
      Convert manually.
      
      Fails to convert hw/rx/rx-gdbsim.c, because Coccinelle gets confused
      by RXCPU being used both as typedef and function-like macro there.
      Convert manually.  The other files using RXCPU that way don't need
      conversion.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Message-Id: <20200707160613.848843-27-armbru@redhat.com>
      [Straightforwad conflict with commit 2336172d "audio: set default
      value for pcspk.iobase property" resolved]
      5325cc34
    • Markus Armbruster's avatar
      qapi: Use returned bool to check for failure, Coccinelle part · 62a35aaa
      Markus Armbruster authored
      
      The previous commit enables conversion of
      
          visit_foo(..., &err);
          if (err) {
              ...
          }
      
      to
      
          if (!visit_foo(..., errp)) {
              ...
          }
      
      for visitor functions that now return true / false on success / error.
      Coccinelle script:
      
          @@
          identifier fun =~ "check_list|input_type_enum|lv_start_struct|lv_type_bool|lv_type_int64|lv_type_str|lv_type_uint64|output_type_enum|parse_type_bool|parse_type_int64|parse_type_null|parse_type_number|parse_type_size|parse_type_str|parse_type_uint64|print_type_bool|print_type_int64|print_type_null|print_type_number|print_type_size|print_type_str|print_type_uint64|qapi_clone_start_alternate|qapi_clone_start_list|qapi_clone_start_struct|qapi_clone_type_bool|qapi_clone_type_int64|qapi_clone_type_null|qapi_clone_type_number|qapi_clone_type_str|qapi_clone_type_uint64|qapi_dealloc_start_list|qapi_dealloc_start_struct|qapi_dealloc_type_anything|qapi_dealloc_type_bool|qapi_dealloc_type_int64|qapi_dealloc_type_null|qapi_dealloc_type_number|qapi_dealloc_type_str|qapi_dealloc_type_uint64|qobject_input_check_list|qobject_input_check_struct|qobject_input_start_alternate|qobject_input_start_list|qobject_input_start_struct|qobject_input_type_any|qobject_input_type_bool|qobject_input_type_bool_keyval|qobject_input_type_int64|qobject_input_type_int64_keyval|qobject_input_type_null|qobject_input_type_number|qobject_input_type_number_keyval|qobject_input_type_size_keyval|qobject_input_type_str|qobject_input_type_str_keyval|qobject_input_type_uint64|qobject_input_type_uint64_keyval|qobject_output_start_list|qobject_output_start_struct|qobject_output_type_any|qobject_output_type_bool|qobject_output_type_int64|qobject_output_type_null|qobject_output_type_number|qobject_output_type_str|qobject_output_type_uint64|start_list|visit_check_list|visit_check_struct|visit_start_alternate|visit_start_list|visit_start_struct|visit_type_.*";
          expression list args;
          typedef Error;
          Error *err;
          @@
          -    fun(args, &err);
          -    if (err)
          +    if (!fun(args, &err))
               {
                   ...
               }
      
      A few line breaks tidied up manually.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Message-Id: <20200707160613.848843-19-armbru@redhat.com>
      62a35aaa
  15. Jun 19, 2020
  16. May 15, 2020
    • Markus Armbruster's avatar
      qom: Drop parameter @errp of object_property_add() & friends · d2623129
      Markus Armbruster authored
      
      The only way object_property_add() can fail is when a property with
      the same name already exists.  Since our property names are all
      hardcoded, failure is a programming error, and the appropriate way to
      handle it is passing &error_abort.
      
      Same for its variants, except for object_property_add_child(), which
      additionally fails when the child already has a parent.  Parentage is
      also under program control, so this is a programming error, too.
      
      We have a bit over 500 callers.  Almost half of them pass
      &error_abort, slightly fewer ignore errors, one test case handles
      errors, and the remaining few callers pass them to their own callers.
      
      The previous few commits demonstrated once again that ignoring
      programming errors is a bad idea.
      
      Of the few ones that pass on errors, several violate the Error API.
      The Error ** argument must be NULL, &error_abort, &error_fatal, or a
      pointer to a variable containing NULL.  Passing an argument of the
      latter kind twice without clearing it in between is wrong: if the
      first call sets an error, it no longer points to NULL for the second
      call.  ich9_pm_add_properties(), sparc32_ledma_realize(),
      sparc32_dma_realize(), xilinx_axidma_realize(), xilinx_enet_realize()
      are wrong that way.
      
      When the one appropriate choice of argument is &error_abort, letting
      users pick the argument is a bad idea.
      
      Drop parameter @errp and assert the preconditions instead.
      
      There's one exception to "duplicate property name is a programming
      error": the way object_property_add() implements the magic (and
      undocumented) "automatic arrayification".  Don't drop @errp there.
      Instead, rename object_property_add() to object_property_try_add(),
      and add the obvious wrapper object_property_add().
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Message-Id: <20200505152926.18877-15-armbru@redhat.com>
      [Two semantic rebase conflicts resolved]
      d2623129
    • Markus Armbruster's avatar
      qom: Drop object_property_set_description() parameter @errp · 7eecec7d
      Markus Armbruster authored
      
      object_property_set_description() and
      object_class_property_set_description() fail only when property @name
      is not found.
      
      There are 85 calls of object_property_set_description() and
      object_class_property_set_description().  None of them can fail:
      
      * 84 immediately follow the creation of the property.
      
      * The one in spapr_rng_instance_init() refers to a property created in
        spapr_rng_class_init(), from spapr_rng_properties[].
      
      Every one of them still gets to decide what to pass for @errp.
      
      51 calls pass &error_abort, 32 calls pass NULL, one receives the error
      and propagates it to &error_abort, and one propagates it to
      &error_fatal.  I'm actually surprised none of them violates the Error
      API.
      
      What are we gaining by letting callers handle the "property not found"
      error?  Use when the property is not known to exist is simpler: you
      don't have to guard the call with a check.  We haven't found such a
      use in 5+ years.  Until we do, let's make life a bit simpler and drop
      the @errp parameter.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Message-Id: <20200505152926.18877-8-armbru@redhat.com>
      [One semantic rebase conflict resolved]
      7eecec7d
  17. May 12, 2020
    • Igor Mammedov's avatar
      hostmem: don't use mbind() if host-nodes is empty · 70b6d525
      Igor Mammedov authored
      
      Since 5.0 QEMU uses hostmem backend for allocating main guest RAM.
      The backend however calls mbind() which is typically NOP
      in case of default policy/absent host-nodes bitmap.
      However when runing in container with black-listed mbind()
      syscall, QEMU fails to start with error
       "cannot bind memory to host NUMA nodes: Operation not permitted"
      even when user hasn't provided host-nodes to pin to explictly
      (which is the case with -m option)
      
      To fix issue, call mbind() only in case when user has provided
      host-nodes explicitly (i.e. host_nodes bitmap is not empty).
      That should allow to run QEMU in containers with black-listed
      mbind() without memory pinning. If QEMU provided memory-pinning
      is required user still has to white-list mbind() in container
      configuration.
      
      Reported-by: default avatarManuel Hohmann <mhohmann@physnet.uni-hamburg.de>
      Signed-off-by: default avatarIgor Mammedov <imammedo@redhat.com>
      Message-Id: <20200430154606.6421-1-imammedo@redhat.com>
      Tested-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
      Cc: qemu-stable@nongnu.org
      Signed-off-by: default avatarEduardo Habkost <ehabkost@redhat.com>
      70b6d525
  18. Apr 29, 2020
    • Markus Armbruster's avatar
      cryptodev: Fix cryptodev_builtin_cleanup() error API violation · 2a340b67
      Markus Armbruster authored
      
      The Error ** argument must be NULL, &error_abort, &error_fatal, or a
      pointer to a variable containing NULL.  Passing an argument of the
      latter kind twice without clearing it in between is wrong: if the
      first call sets an error, it no longer points to NULL for the second
      call.
      
      cryptodev_builtin_cleanup() passes @errp to
      cryptodev_builtin_sym_close_session() in a loop.  Harmless, because
      cryptodev_builtin_sym_close_session() can't actually fail.  Fix it
      anyway.
      
      Cc: Gonglei <arei.gonglei@huawei.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Message-Id: <20200422130719.28225-2-armbru@redhat.com>
      2a340b67
  19. Apr 14, 2020
  20. Feb 19, 2020
    • Igor Mammedov's avatar
      hostmem: fix strict bind policy · 4ebc74db
      Igor Mammedov authored
      
      When option -mem-prealloc is used with one or more memory-backend
      objects, created backends may not obey configured bind policy or
      creation may fail after kernel attempts to move pages according
      to bind policy.
      Reason is in file_ram_alloc(), which will pre-allocate
      any descriptor based RAM if global mem_prealloc != 0 and that
      happens way before bind policy is applied to memory range.
      
      One way to fix it would be to extend memory_region_foo() API
      and add more invariants that could broken later due implicit
      dependencies that's hard to track.
      
      Another approach is to drop adhoc main RAM allocation and
      consolidate it around memory-backend. That allows to have
      single place that allocates guest RAM (main and memdev)
      in the same way and then global mem_prealloc could be
      replaced by backend's property[s] that will affect created
      memory-backend objects but only in correct order this time.
      
      With main RAM now converted to hostmem backends, there is no
      point in keeping global mem_prealloc around, so alias
       -mem-prealloc to "memory-backend.prealloc=on"
      machine compat[*] property and make mem_prealloc a local
      variable to only stir registration of compat property.
      
      *) currently user accessible -global works only with DEVICE
         based objects and extra work is needed to make it work
         with hostmem backends. But that is convenience option
         and out of scope of this already huge refactoring.
         Hence machine compat properties were used.
      
      Signed-off-by: default avatarIgor Mammedov <imammedo@redhat.com>
      Message-Id: <20200219160953.13771-78-imammedo@redhat.com>
      4ebc74db
    • Igor Mammedov's avatar
      hostmem: introduce "prealloc-threads" property · ffac16fa
      Igor Mammedov authored
      
      the property will allow user to specify number of threads to use
      in pre-allocation stage. It also will allow to reduce implicit
      hostmem dependency on current_machine.
      On object creation it will default to 1, but via machine
      compat property it will be updated to MachineState::smp::cpus
      to keep current behavior for hostmem and main RAM (which is
      now also hostmem based).
      
      Signed-off-by: default avatarIgor Mammedov <imammedo@redhat.com>
      Message-Id: <20200219160953.13771-77-imammedo@redhat.com>
      ffac16fa
    • Igor Mammedov's avatar
      machine: alias -mem-path and -mem-prealloc into memory-foo backend · 900c0ba3
      Igor Mammedov authored
      
      Allow machine to opt in for hostmem backend based initial RAM
      even if user uses old -mem-path/prealloc options by providing
        MachineClass::default_ram_id
      Follow up patches will incrementally convert machines to new API,
      by dropping memory_region_allocate_system_memory() and setting
      default_ram_id that board used to use before conversion to keep
      migration stream the same.
      
      Signed-off-by: default avatarIgor Mammedov <imammedo@redhat.com>
      Message-Id: <20200219160953.13771-4-imammedo@redhat.com>
      900c0ba3
Loading