All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Bandan Das <bsd@redhat.com>
Cc: qemu-devel@nongnu.org, mst@redhat.com
Subject: Re: [Qemu-devel] [PATCH 3/4] qdev: allow both pre- and post-order vists in qdev walking functions
Date: Mon, 09 Dec 2013 10:50:14 +0100	[thread overview]
Message-ID: <52A59256.6030105@redhat.com> (raw)
In-Reply-To: <jpgsiu5d0hf.fsf@redhat.com>

Il 07/12/2013 00:27, Bandan Das ha scritto:
> Paolo Bonzini <pbonzini@redhat.com> writes:
> 
>> Resetting should be done in post-order, not pre-order.  However,
>> qdev_walk_children and qbus_walk_children do not allow this.  Fix
>> it by adding two extra arguments to the functions.
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>> ---
>>  hw/core/qdev.c         |   45 +++++++++++++++++++++++++++++++++------------
>>  include/hw/qdev-core.h |   13 +++++++++----
>>  2 files changed, 42 insertions(+), 16 deletions(-)
>>
>> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
>> index 758de9f..1c114b7 100644
>> --- a/hw/core/qdev.c
>> +++ b/hw/core/qdev.c
>> @@ -240,12 +240,12 @@ static int qbus_reset_one(BusState *bus, void *opaque)
>>  
>>  void qdev_reset_all(DeviceState *dev)
>>  {
>> -    qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL);
>> +    qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL, NULL, NULL);
>>  }
>>  
>>  void qbus_reset_all(BusState *bus)
>>  {
>> -    qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL);
>> +    qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL, NULL, NULL);
>>  }
>>  
>>  void qbus_reset_all_fn(void *opaque)
>> @@ -343,49 +343,70 @@ BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
>>      return NULL;
>>  }
>>  
>> -int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
>> -                       qbus_walkerfn *busfn, void *opaque)
>> +int qbus_walk_children(BusState *bus,
>> +                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
>> +                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
>> +                       void *opaque)
>>  {
> 
> It's either pre or post right ? I also thought that the traversal 
> applies to the whole hierarchy not just buses or devices individually..
> Why not just have a single parameter that says pre or post, not much 
> difference but atleast one parameter less.

This is a generic walk function.

For reset you want post-order, but in other cases pre-order may make
more sense, for example realize.

Paolo

> Bandan
> 
>>      BusChild *kid;
>>      int err;
>>  
>> -    if (busfn) {
>> -        err = busfn(bus, opaque);
>> +    if (pre_busfn) {
>> +        err = pre_busfn(bus, opaque);
>>          if (err) {
>>              return err;
>>          }
>>      }
>>  
>>      QTAILQ_FOREACH(kid, &bus->children, sibling) {
>> -        err = qdev_walk_children(kid->child, devfn, busfn, opaque);
>> +        err = qdev_walk_children(kid->child,
>> +                                 pre_devfn, pre_busfn,
>> +                                 post_devfn, post_busfn, opaque);
>>          if (err < 0) {
>>              return err;
>>          }
>>      }
>>  
>> +    if (post_busfn) {
>> +        err = post_busfn(bus, opaque);
>> +        if (err) {
>> +            return err;
>> +        }
>> +    }
>> +
>>      return 0;
>>  }
>>  
>> -int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
>> -                       qbus_walkerfn *busfn, void *opaque)
>> +int qdev_walk_children(DeviceState *dev,
>> +                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
>> +                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
>> +                       void *opaque)
>>  {
>>      BusState *bus;
>>      int err;
>>  
>> -    if (devfn) {
>> -        err = devfn(dev, opaque);
>> +    if (pre_devfn) {
>> +        err = pre_devfn(dev, opaque);
>>          if (err) {
>>              return err;
>>          }
>>      }
>>  
>>      QLIST_FOREACH(bus, &dev->child_bus, sibling) {
>> -        err = qbus_walk_children(bus, devfn, busfn, opaque);
>> +        err = qbus_walk_children(bus, pre_devfn, pre_busfn,
>> +                                 post_devfn, post_busfn, opaque);
>>          if (err < 0) {
>>              return err;
>>          }
>>      }
>>  
>> +    if (post_devfn) {
>> +        err = post_devfn(dev, opaque);
>> +        if (err) {
>> +            return err;
>> +        }
>> +    }
>> +
>>      return 0;
>>  }
>>  
>> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
>> index d840f06..21ea2c6 100644
>> --- a/include/hw/qdev-core.h
>> +++ b/include/hw/qdev-core.h
>> @@ -274,10 +274,15 @@ BusState *qbus_create(const char *typename, DeviceState *parent, const char *nam
>>  /* Returns > 0 if either devfn or busfn skip walk somewhere in cursion,
>>   *         < 0 if either devfn or busfn terminate walk somewhere in cursion,
>>   *           0 otherwise. */
>> -int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
>> -                       qbus_walkerfn *busfn, void *opaque);
>> -int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
>> -                       qbus_walkerfn *busfn, void *opaque);
>> +int qbus_walk_children(BusState *bus,
>> +                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
>> +                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
>> +                       void *opaque);
>> +int qdev_walk_children(DeviceState *dev,
>> +                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
>> +                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
>> +                       void *opaque);
>> +
>>  void qdev_reset_all(DeviceState *dev);
>>  
>>  /**

  reply	other threads:[~2013-12-09  9:50 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-06 16:54 [Qemu-devel] [PATCH 0/4] qdev: switch reset to post-order, clean up PCI reset Paolo Bonzini
2013-12-06 16:54 ` [Qemu-devel] [PATCH 1/4] pci: do not export pci_bus_reset Paolo Bonzini
2013-12-06 16:54 ` [Qemu-devel] [PATCH 2/4] pci: clean up resetting of IRQs Paolo Bonzini
2013-12-06 16:54 ` [Qemu-devel] [PATCH 3/4] qdev: allow both pre- and post-order vists in qdev walking functions Paolo Bonzini
2013-12-06 23:27   ` Bandan Das
2013-12-09  9:50     ` Paolo Bonzini [this message]
2013-12-09 17:56       ` Bandan Das
2013-12-09 18:04         ` Paolo Bonzini
2013-12-09 18:15           ` Bandan Das
2013-12-09 18:05         ` Paolo Bonzini
2013-12-06 16:54 ` [Qemu-devel] [PATCH 4/4] qdev: switch reset to post-order Paolo Bonzini
2013-12-19 18:23   ` Michael S. Tsirkin
2013-12-19 19:15 ` [Qemu-devel] [PATCH 0/4] qdev: switch reset to post-order, clean up PCI reset Michael S. Tsirkin
2013-12-19 23:45   ` Paolo Bonzini
  -- strict thread matches above, loose matches on Subject: below --
2013-10-03 13:46 Paolo Bonzini
2013-10-03 13:46 ` [Qemu-devel] [PATCH 3/4] qdev: allow both pre- and post-order vists in qdev walking functions Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52A59256.6030105@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=bsd@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.