1. 30 6月, 2017 5 次提交
    • D
      spapr: Clean up DRC set_allocation_state path · 61736732
      David Gibson 提交于
      The allocation-state indicator should only actually be implemented for
      "logical" DRCs, not physical ones.  Factor a check for this, and also for
      valid indicator state values into rtas_set_allocation_state().  Because
      they don't exist for physical DRCs, there's no reason that we'd ever want
      more than one method implementation, so it can just be a plain function.
      
      In addition, the setting to USABLE and setting to UNUSABLE paths in
      set_allocation_state() don't actually have much in common.  So, split the
      method separate functions for each parameter value (drc_set_usable()
      and drc_set_unusable()).
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      61736732
    • D
      spapr: Make DRC reset force DRC into known state · 4f9242fc
      David Gibson 提交于
      The reset handler for DRCs attempts several state transitions which are
      subject to various checks and restrictions.  But at reset time we know
      there is no guest, so we can ignore most of the usual sequencing rules and
      just set the DRC back to a known state.  In fact, it's safer to do so.
      
      The existing code also has several redundant checks for
      drc->awaiting_release inside a block which has already tested that.  This
      patch removes those and sets the DRC to a fixed initial state based only
      on whether a device is currently plugged or not.
      
      With DRCs correctly reset to a state based on device presence, we don't
      need to force state transitions as cold plugged devices are processed.
      This allows us to remove all the callers of the set_*_state() methods from
      outside spapr_drc.c.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      4f9242fc
    • D
      spapr: Split DRC release from DRC detach · 9c914e53
      David Gibson 提交于
      spapr_drc_detach() is called when qemu generic code requests a device be
      unplugged.  It makes a number of tests, which could well delay further
      action until later, before actually detach the device from the DRC.
      
      This splits out the part which actually removes the device from the DRC
      into spapr_drc_release().  This will be useful for further cleanups.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      9c914e53
    • D
      spapr: Eliminate DRC 'signalled' state variable · 307b7715
      David Gibson 提交于
      The 'signalled' field in the DRC appears to be entirely a torturous
      workaround for the fact that PCI devices were started in UNISOLATED state
      for unclear reasons.
      
      1) 'signalled' is already meaningless for logical (so far, all non PCI)
      DRCs.  It's always set to true (at least at any point it might be tested),
      and can't be assigned any real meaning due to the way signalling works for
      logical DRCs.
      
      2) For PCI DRCs, the only time signalled would be false is when non-zero
      functions of a multifunction device are hotplugged, followed by function
      zero (the other way around is explicitly not permitted). In that case the
      secondary function DRCs are attached, but the notification isn't sent to
      the guest until function 0 is plugged.
      
      3) signalled being false is used to allow a DRC detach to switch mode
      back to ISOLATED state, which allows a secondary function to be hotplugged
      then unplugged with function 0 never inserted.  Without this a secondary
      function starting in UNISOLATED state couldn't be detached again without
      function 0 being inserted, all the functions configured by the guest, then
      sent back to ISOLATED state.
      
      4) But now that PCI DRCs start in ISOLATED state, there's nothing to be
      done.  If the guest doesn't get the notification, it won't switch the
      device to UNISOLATED state, so nothing prevents it from being unplugged.
      If the guest does move it to UNISOLATED state without the signal (due to
      a manual drmgr call, for instance) then it really isn't safe to unplug it.
      
      So, this patch removes the signalled variable and all code related to it.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      307b7715
    • D
      spapr: Start hotplugged PCI devices in ISOLATED state · af8ad96b
      David Gibson 提交于
      PCI DRCs, and only PCI DRCs, are immediately moved to UNISOLATED isolation
      state once the device is attached.  This has been there from the initial
      implementation, and it's not clear why.
      
      The state diagram in PAPR 13.4 suggests PCI devices should start in
      ISOLATED state until the guest moves them into UNISOLATED, and the code in
      the guest-side drmgr tool seems to work that way too.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      Reviewed-by: NGreg Kurz <groug@kaod.org>
      af8ad96b
  2. 09 6月, 2017 1 次提交
  3. 08 6月, 2017 5 次提交
    • D
      spapr: Rework DRC name handling · 79808336
      David Gibson 提交于
      DRC objects have a get_name method which returns the DRC name generated
      when the DRC is created.  Replace that with a fixed spapr_drc_name()
      function which generates the name on the fly from other information.  This
      means:
        * We get rid of a method with only one implementation, and only local
          callers
        * We don't have to carry the name string around for the lifetime of the
          DRC
        * We use information added to the class structure to generate the name
          in standard format, so we don't need an explicit switch on drc type
          any more
      
      We also eliminate the 'name' property; it's basically useless since the
      only information in it can easily be deduced from other things.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      Acked-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      79808336
    • D
      spapr: Change DRC attach & detach methods to functions · 0be4e886
      David Gibson 提交于
      DRC objects have attach & detach methods, but there's only one
      implementation.  Although there are some differences in its behaviour for
      different DRC types, the overall structure is the same, so while we might
      want different method implementations for some parts, we're unlikely to
      want them for the top-level functions.
      
      So, replace them with direct function calls.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      Acked-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      0be4e886
    • D
      spapr: Clean up handling of DR-indicator · cd74d27e
      David Gibson 提交于
      There are 3 types of "indicator" associated with hotplug in the PAPR spec
      the "allocation state", "isolation state" and "DR-indicator".  The first
      two are intimately tied to the various state transitions associated with
      hotplug.  The DR-indicator, however, is different and simpler.
      
      It's basically just a guest controlled variable which can be used by the
      guest to flag state or problems associated with a device.  The idea is that
      the hypervisor can use it to present information back on management
      consoles (on some machines with PowerVM it may even control physical LEDs
      on the machine case associated with the relevant device).
      
      For that reason, there's only ever likely to be a single update
      implementation so the set_indicator_state method isn't useful.  Replace it
      with a direct function call.
      
      While we're there, make some small associated cleanups:
        * PAPR doesn't use the term "indicator state", just "DR-indicator" and
      the allocation state and isolation state are also considered "indicators".
      Rename things to be less confusing
        * Fold set_indicator_state() and rtas_set_indicator_state() into a single
      rtas_set_dr_indicator() function.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      Acked-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      cd74d27e
    • D
      spapr: Clean up RTAS set-indicator · 7b7258f8
      David Gibson 提交于
      In theory the RTAS set-indicator call can be used for a number of
      "indicators" defined by PAPR.  In practice the only ones we're ever likely
      to implement are those used for Dynamic Reconfiguration (i.e. hotplug).
      Because of this, the current implementation determines the associated DRC
      object, before dispatching based on the type of indicator.
      
      However, this means we also need a check that we're dealing with a DR
      related indicator at all, which duplicates some of the logic from the
      switch further down.
      
      Even though it means a bit of code duplication, things work out cleaner if
      we delegate the DRC lookup to the individual indicator type functions -
      and it also allows some further cleanups.
      
      While we're there, remove references to "sensor", a copy/paste artefact
      from the related, but distinct "get-sensor" call.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      Acked-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      7b7258f8
    • D
      spapr: Clean up DR entity sense handling · f224d35b
      David Gibson 提交于
      DRC classes have an entity_sense method to determine (in a specific PAPR
      sense) the presence or absence of a device plugged into a DRC.  However,
      we only have one implementation of the method, which explicitly tests for
      different DRC types.  This changes it to instead have different method
      implementations for the two cases: "logical" and "physical" DRCs.
      
      While we're at it, the entity sense method always returns RTAS_OUT_SUCCESS,
      and the interesting value is returned via pass-by-reference.  Simplify this
      to directly return the value we care about
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      Acked-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      f224d35b
  4. 06 6月, 2017 10 次提交
  5. 25 5月, 2017 2 次提交
    • D
      hw/ppc: migrating the DRC state of hotplugged devices · a50919dd
      Daniel Henrique Barboza 提交于
      In pseries, a firmware abstraction called Dynamic Reconfiguration
      Connector (DRC) is used to assign a particular dynamic resource
      to the guest and provide an interface to manage configuration/removal
      of the resource associated with it. In other words, DRC is the
      'plugged state' of a device.
      
      Before this patch, DRC wasn't being migrated. This causes
      post-migration problems due to DRC state mismatch between source and
      target. The DRC state of a device X in the source might
      change, while in the target the DRC state of X is still fresh. When
      migrating the guest, X will not have the same hotplugged state as it
      did in the source. This means that we can't hot unplug X in the
      target after migration is completed because its DRC state is not consistent.
      https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/1677552 is one
      bug that is caused by this DRC state mismatch between source and
      target.
      
      To migrate the DRC state, we defined the VMStateDescription struct for
      spapr_drc to enable the transmission of spapr_drc state in migration.
      Not all the elements in the DRC state are migrated - only those
      that can be modified by guest actions or device add/remove
      operations:
      
      - 'isolation_state', 'allocation_state' and 'indicator_state'
      are involved in the DR state transition diagram from
      PAPR+ 2.7, 13.4;
      
      - 'configured', 'signalled', 'awaiting_release' and 'awaiting_allocation'
      are needed in attaching and detaching devices;
      
      - 'indicator_state' provides users with hardware state information.
      
      These are the DRC elements that are migrated.
      
      In this patch the DRC state is migrated for PCI, LMB and CPU
      connector types. At this moment there is no support to migrate
      DRC for the PHB (PCI Host Bridge) type.
      
      In the 'realize' function the DRC is registered using vmstate_register,
      similar to what hw/ppc/spapr_iommu.c does in 'spapr_tce_table_realize'.
      This approach works because  DRCs are bus-less and do not sit
      on a BusClass that implements bc->get_dev_path, so as a fallback the
      VMSD gets identified via "spapr_drc"/get_index(drc).
      Signed-off-by: NDaniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      a50919dd
    • D
      hw/ppc: removing drc->detach_cb and drc->detach_cb_opaque · 31834723
      Daniel Henrique Barboza 提交于
      The pointer drc->detach_cb is being used as a way of informing
      the detach() function inside spapr_drc.c which cb to execute. This
      information can also be retrieved simply by checking drc->type and
      choosing the right callback based on it. In this context, detach_cb
      is redundant information that must be managed.
      
      After the previous spapr_lmb_release change, no detach_cb_opaques
      are being used by any of the three callbacks functions. This is
      yet another information that is now unused and, on top of that, can't
      be migrated either.
      
      This patch makes the following changes:
      
      - removal of detach_cb_opaque. the 'opaque' argument was removed from
      the callbacks and from the detach() function of sPAPRConnectorClass. The
      attribute detach_cb_opaque of sPAPRConnector was removed.
      
      - removal of detach_cb from the detach() call. The function pointer
      detach_cb of sPAPRConnector was removed. detach() now uses a
      switch(drc->type) to execute the apropriate callback. To achieve this,
      spapr_core_release, spapr_lmb_release and spapr_phb_remove_pci_device_cb
      callbacks were made public to be visible inside detach().
      Signed-off-by: NDaniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      31834723
  6. 17 5月, 2017 1 次提交
    • E
      qdev: Replace cannot_instantiate_with_device_add_yet with !user_creatable · e90f2a8c
      Eduardo Habkost 提交于
      cannot_instantiate_with_device_add_yet was introduced by commit
      efec3dd6 to replace no_user. It was
      supposed to be a temporary measure.
      
      When it was introduced, we had 54
      cannot_instantiate_with_device_add_yet=true lines in the code.
      Today (3 years later) this number has not shrunk: we now have
      57 cannot_instantiate_with_device_add_yet=true lines. I think it
      is safe to say it is not a temporary measure, and we won't see
      the flag go away soon.
      
      Instead of a long field name that misleads people to believe it
      is temporary, replace it a shorter and less misleading field:
      user_creatable.
      
      Except for code comments, changes were generated using the
      following Coccinelle patch:
      
        @@
        expression DC;
        @@
        (
        -DC->cannot_instantiate_with_device_add_yet = false;
        +DC->user_creatable = true;
        |
        -DC->cannot_instantiate_with_device_add_yet = true;
        +DC->user_creatable = false;
        )
      
        @@
        typedef ObjectClass;
        expression dc;
        identifier class, data;
        @@
         static void device_class_init(ObjectClass *class, void *data)
         {
         ...
         dc->hotpluggable = true;
        +dc->user_creatable = true;
         ...
         }
      
        @@
        @@
         struct DeviceClass {
         ...
        -bool cannot_instantiate_with_device_add_yet;
        +bool user_creatable;
         ...
        }
      
        @@
        expression DC;
        @@
        (
        -!DC->cannot_instantiate_with_device_add_yet
        +DC->user_creatable
        |
        -DC->cannot_instantiate_with_device_add_yet
        +!DC->user_creatable
        )
      
      Cc: Alistair Francis <alistair.francis@xilinx.com>
      Cc: Laszlo Ersek <lersek@redhat.com>
      Cc: Marcel Apfelbaum <marcel@redhat.com>
      Cc: Markus Armbruster <armbru@redhat.com>
      Cc: Peter Maydell <peter.maydell@linaro.org>
      Cc: Thomas Huth <thuth@redhat.com>
      Acked-by: NAlistair Francis <alistair.francis@xilinx.com>
      Reviewed-by: NThomas Huth <thuth@redhat.com>
      Reviewed-by: NMarcel Apfelbaum <marcel@redhat.com>
      Acked-by: NMarcel Apfelbaum <marcel@redhat.com>
      Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
      Message-Id: <20170503203604.31462-2-ehabkost@redhat.com>
      [ehabkost: kept "TODO remove once we're there" comment]
      Reviewed-by: NMarkus Armbruster <armbru@redhat.com>
      Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
      e90f2a8c
  7. 29 3月, 2017 1 次提交
    • L
      spapr: fix memory hot-unplugging · fe6824d1
      Laurent Vivier 提交于
      If, once the kernel has booted, we try to remove a memory
      hotplugged while the kernel was not started, QEMU crashes on
      an assert:
      
          qemu-system-ppc64: hw/virtio/vhost.c:651:
                             vhost_commit: Assertion `r >= 0' failed.
          ...
          #4  in vhost_commit
          #5  in memory_region_transaction_commit
          #6  in pc_dimm_memory_unplug
          #7  in spapr_memory_unplug
          #8  spapr_machine_device_unplug
          #9  in hotplug_handler_unplug
          #10 in spapr_lmb_release
          #11 in detach
          #12 in set_allocation_state
          #13 in rtas_set_indicator
          ...
      
      If we take a closer look to the guest kernel log, we can see when
      we try to unplug the memory:
      
          pseries-hotplug-mem: Attempting to hot-add 4 LMB(s)
      
      What happens:
      
          1- The kernel has ignored the memory hotplug event because
             it was not started when it was generated.
      
          2- When we hot-unplug the memory,
             QEMU starts to remove the memory,
                  generates an hot-unplug event,
              and signals the kernel of the incoming new event
      
          3- as the kernel is started, on the QEMU signal, it reads
             the event list, decodes the hotplug event and tries to
             finish the hotplugging.
      
          4- QEMU receive the the hotplug notification while it
             is trying to hot-unplug the memory. This moves the memory
             DRC to an invalid state
      
      This patch prevents this by not allowing to set the allocation
      state to USABLE while the DRC is awaiting release.
      
      RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1432382Signed-off-by: NLaurent Vivier <lvivier@redhat.com>
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      fe6824d1
  8. 05 3月, 2017 1 次提交
    • M
      qapi: Make input visitors detect unvisited list tails · a4a1c70d
      Markus Armbruster 提交于
      Fix the design flaw demonstrated in the previous commit: new method
      check_list() lets input visitors report that unvisited input remains
      for a list, exactly like check_struct() lets them report that
      unvisited input remains for a struct or union.
      
      Implement the method for the qobject input visitor (straightforward),
      and the string input visitor (less so, due to the magic list syntax
      there).  The opts visitor's list magic is even more impenetrable, and
      all I can do there today is a stub with a FIXME comment.  No worse
      than before.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Message-Id: <1488544368-30622-26-git-send-email-armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      a4a1c70d
  9. 25 1月, 2017 1 次提交
  10. 28 10月, 2016 1 次提交
  11. 23 9月, 2016 1 次提交
  12. 07 9月, 2016 1 次提交
  13. 06 7月, 2016 1 次提交
    • E
      qapi: Add parameter to visit_end_* · 1158bb2a
      Eric Blake 提交于
      Rather than making the dealloc visitor track of stack of pointers
      remembered during visit_start_* in order to free them during
      visit_end_*, it's a lot easier to just make all callers pass the
      same pointer to visit_end_*.  The generated code has access to the
      same pointer, while all other users are doing virtual walks and
      can pass NULL.  The dealloc visitor is then greatly simplified.
      
      All three visit_end_*() functions intentionally take a void**,
      even though the visit_start_*() functions differ between void**,
      GenericList**, and GenericAlternate**.  This is done for several
      reasons: when doing a virtual walk, passing NULL doesn't care
      what the type is, but when doing a generated walk, we already
      have to cast the caller's specific FOO* to call visit_start,
      while using void** lets us use visit_end without a cast. Also,
      an upcoming patch will add a clone visitor that wants to use
      the same implementation for all three visit_end callbacks,
      which is made easier if all three share the same signature.
      
      For visitors with already track per-object state (the QMP visitors
      via a stack, and the string visitors which do not allow nesting),
      add an assertion that the caller is indeed passing the same
      pointer to paired calls.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1465490926-28625-4-git-send-email-eblake@redhat.com>
      Reviewed-by: NMarkus Armbruster <armbru@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      1158bb2a
  14. 17 6月, 2016 1 次提交
  15. 12 5月, 2016 3 次提交
    • E
      qapi: Simplify semantics of visit_next_list() · d9f62dde
      Eric Blake 提交于
      The semantics of the list visit are somewhat baroque, with the
      following pseudocode when FooList is used:
      
      start()
      for (prev = head; cur = next(prev); prev = &cur) {
          visit(&cur->value)
      }
      
      Note that these semantics (advance before visit) requires that
      the first call to next() return the list head, while all other
      calls return the next element of the list; that is, every visitor
      implementation is required to track extra state to decide whether
      to return the input as-is, or to advance.  It also requires an
      argument of 'GenericList **' to next(), solely because the first
      iteration might need to modify the caller's GenericList head, so
      that all other calls have to do a layer of dereferencing.
      
      Thankfully, we only have two uses of list visits in the entire
      code base: one in spapr_drc (which completely avoids
      visit_next_list(), feeding in integers from a different source
      than uint8List), and one in qapi-visit.py.  That is, all other
      list visitors are generated in qapi-visit.c, and share the same
      paradigm based on a qapi FooList type, so we can refactor how
      lists are laid out with minimal churn among clients.
      
      We can greatly simplify things by hoisting the special case
      into the start() routine, and flipping the order in the loop
      to visit before advance:
      
      start(head)
      for (tail = *head; tail; tail = next(tail)) {
          visit(&tail->value)
      }
      
      With the simpler semantics, visitors have less state to track,
      the argument to next() is reduced to 'GenericList *', and it
      also becomes obvious whether an input visitor is allocating a
      FooList during visit_start_list() (rather than the old way of
      not knowing if an allocation happened until the first
      visit_next_list()).  As a minor drawback, we now allocate in
      two functions instead of one, and have to pass the size to
      both functions (unless we were to tweak the input visitors to
      cache the size to start_list for reuse during next_list, but
      that defeats the goal of less visitor state).
      
      The signature of visit_start_list() is chosen to match
      visit_start_struct(), with the new parameters after 'name'.
      
      The spapr_drc case is a virtual visit, done by passing NULL for
      list, similarly to how NULL is passed to visit_start_struct()
      when a qapi type is not used in those visits.  It was easy to
      provide these semantics for qmp-output and dealloc visitors,
      and a bit harder for qmp-input (several prerequisite patches
      refactored things to make this patch straightforward).  But it
      turned out that the string and opts visitors munge enough other
      state during visit_next_list() to make it easier to just
      document and require a GenericList visit for now; an assertion
      will remind us to adjust things if we need the semantics in the
      future.
      
      Several pre-requisite cleanup patches made the reshuffling of
      the various visitors easier; particularly the qmp input visitor.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1461879932-9020-24-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      d9f62dde
    • E
      qapi: Split visit_end_struct() into pieces · 15c2f669
      Eric Blake 提交于
      As mentioned in previous patches, we want to call visit_end_struct()
      functions unconditionally, so that visitors can release resources
      tied up since the matching visit_start_struct() without also having
      to worry about error priority if more than one error occurs.
      
      Even though error_propagate() can be safely used to ignore a second
      error during cleanup caused by a first error, it is simpler if the
      cleanup cannot set an error.  So, split out the error checking
      portion (basically, input visitors checking for unvisited keys) into
      a new function visit_check_struct(), which can be safely skipped if
      any earlier errors are encountered, and leave the cleanup portion
      (which never fails, but must be called unconditionally if
      visit_start_struct() succeeded) in visit_end_struct().
      
      Generated code in qapi-visit.c has diffs resembling:
      
      |@@ -59,10 +59,12 @@ void visit_type_ACPIOSTInfo(Visitor *v,
      |         goto out_obj;
      |     }
      |     visit_type_ACPIOSTInfo_members(v, obj, &err);
      |-    error_propagate(errp, err);
      |-    err = NULL;
      |+    if (err) {
      |+        goto out_obj;
      |+    }
      |+    visit_check_struct(v, &err);
      | out_obj:
      |-    visit_end_struct(v, &err);
      |+    visit_end_struct(v);
      | out:
      
      and in qapi-event.c:
      
      @@ -47,7 +47,10 @@ void qapi_event_send_acpi_device_ost(ACP
      |         goto out;
      |     }
      |     visit_type_q_obj_ACPI_DEVICE_OST_arg_members(v, &param, &err);
      |-    visit_end_struct(v, err ? NULL : &err);
      |+    if (!err) {
      |+        visit_check_struct(v, &err);
      |+    }
      |+    visit_end_struct(v);
      |     if (err) {
      |         goto out;
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1461879932-9020-20-git-send-email-eblake@redhat.com>
      [Conflict with a doc fixup resolved]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      15c2f669
    • E
      spapr_drc: Expose 'null' in qom-get when there is no fdt · a543a554
      Eric Blake 提交于
      Now that the QMP output visitor supports an explicit null
      output, we should utilize it to make it easier to diagnose
      the difference between a missing fdt ('null') vs. a
      present-but-empty one ('{}').
      
      (Note that this reverts the behavior of commit ab8bf1d7, taking
      us back to the behavior of commit 6c2f9a15 [which in turn
      stemmed from a crash fix in 1d10b445]; but that this time,
      the change is intentional and not an accidental side-effect.)
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Acked-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Message-Id: <1461879932-9020-17-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      a543a554
  16. 26 4月, 2016 1 次提交
    • M
      spapr_drc: fix aborts during DRC-count based hotplug · df18b2db
      Michael Roth 提交于
      CPU/memory resources can be signalled en-masse via
      spapr_hotplug_req_add_by_count(), and when doing so, actually change
      the meaning of the 'drc' parameter passed to
      spapr_hotplug_req_event() to be a count rather than an index.
      
      f40eb921 added a hook in spapr_hotplug_req_event() to record when a
      device had been 'signalled' to the guest, but that code assumes that
      drc is always an index. In cases where it's a count, such as memory
      hotplug, the DRC lookup will fail, leading to an assert.
      
      Fix this by only explicitly setting the signalled state for cases where
      we are doing PCI hotplug.
      
      For other resources types, since we cannot selectively track whether a
      resource has been signalled in cases where we signal attach as a count,
      set the 'signalled' state to true immediately upon making the
      resource available via drck->attach().
      Reported-by: NBharata B Rao <bharata@linux.vnet.ibm.com>
      Cc: Bharata B Rao <bharata@linux.vnet.ibm.com>
      Cc: david@gibson.dropbear.id.au
      Cc: qemu-ppc@nongnu.org
      Signed-off-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      df18b2db
  17. 05 4月, 2016 1 次提交
    • M
      spapr_drc: enable immediate detach for unsignalled devices · f40eb921
      Michael Roth 提交于
      Currently spapr doesn't support "aborting" hotplug of PCI
      devices by allowing device_del to immediately remove the
      device if we haven't signalled the presence of the device
      to the guest.
      
      In the past this wasn't an issue, since we always immediately
      signalled device attach and simply relied on full guest-aware
      add->remove path for device removal. However, as of 788d2599,
      we now defer signalling for PCI functions until function 0
      is attached, so now we need to deal with these "abort" operations
      for cases where a user hotplugs a non-0 function, then opts to
      remove it prior hotplugging function 0. Currently they'd have to
      reboot before the unplug completed. PCIe multifunction hotplug
      does not have this requirement however, so from a management
      implementation perspective it would be good to address this within
      the same release as 788d2599.
      
      We accomplish this by simply adding a 'signalled' flag to track
      whether a device hotplug event has been sent to the guest. If it
      hasn't, we allow immediate removal under the assumption that the
      guest will not be using the device. Devices present at boot/reset
      time are also assumed to be 'signalled'.
      
      For CPU/memory/etc, signalling will still happen immediately
      as part of device_add, so only PCI functions should be affected.
      
      Cc: bharata@linux.vnet.ibm.com
      Cc: david@gibson.dropbear.id.au
      Cc: sbhat@linux.vnet.ibm.com
      Cc: qemu-ppc@nongnu.org
      Signed-off-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      [dwg: This fixes a regression where an incorrect hot-add of a non-zero
            function can no longer be backed out until function 0 is added]
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      f40eb921
  18. 23 3月, 2016 3 次提交
    • V
      util: move declarations out of qemu-common.h · f348b6d1
      Veronia Bahaa 提交于
      Move declarations out of qemu-common.h for functions declared in
      utils/ files: e.g. include/qemu/path.h for utils/path.c.
      Move inline functions out of qemu-common.h and into new files (e.g.
      include/qemu/bcd.h)
      Signed-off-by: NVeronia Bahaa <veroniabahaa@gmail.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      f348b6d1
    • P
      hw: explicitly include qemu-common.h and cpu.h · 4771d756
      Paolo Bonzini 提交于
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      4771d756
    • M
      include/qemu/osdep.h: Don't include qapi/error.h · da34e65c
      Markus Armbruster 提交于
      Commit 57cb38b3 included qapi/error.h into qemu/osdep.h to get the
      Error typedef.  Since then, we've moved to include qemu/osdep.h
      everywhere.  Its file comment explains: "To avoid getting into
      possible circular include dependencies, this file should not include
      any other QEMU headers, with the exceptions of config-host.h,
      compiler.h, os-posix.h and os-win32.h, all of which are doing a
      similar job to this file and are under similar constraints."
      qapi/error.h doesn't do a similar job, and it doesn't adhere to
      similar constraints: it includes qapi-types.h.  That's in excess of
      100KiB of crap most .c files don't actually need.
      
      Add the typedef to qemu/typedefs.h, and include that instead of
      qapi/error.h.  Include qapi/error.h in .c files that need it and don't
      get it now.  Include qapi-types.h in qom/object.h for uint16List.
      
      Update scripts/clean-includes accordingly.  Update it further to match
      reality: replace config.h by config-target.h, add sysemu/os-posix.h,
      sysemu/os-win32.h.  Update the list of includes in the qemu/osdep.h
      comment quoted above similarly.
      
      This reduces the number of objects depending on qapi/error.h from "all
      of them" to less than a third.  Unfortunately, the number depending on
      qapi-types.h shrinks only a little.  More work is needed for that one.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      [Fix compilation without the spice devel packages. - Paolo]
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      da34e65c