qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Isaku Yamahata <yamahata@valinux.co.jp>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 6/9] pci.c: factor out while(bus) bus->next loop logic into pci_find_bus_from().
Date: Thu, 1 Oct 2009 08:28:26 +0200	[thread overview]
Message-ID: <20091001062826.GD5142@redhat.com> (raw)
In-Reply-To: <20091001032934.GM24813%yamahata@valinux.co.jp>

On Thu, Oct 01, 2009 at 12:29:34PM +0900, Isaku Yamahata wrote:
> On Wed, Sep 30, 2009 at 01:45:06PM +0200, Michael S. Tsirkin wrote:
> > On Wed, Jul 15, 2009 at 08:15:06PM +0900, Isaku Yamahata wrote:
> > > factor out while(bus) bus->next loop logic into pci_find_bus_from()
> > > which will be used later.
> > > 
> > > Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> > > ---
> > >  hw/pci.c |   26 ++++++++++++++------------
> > >  1 files changed, 14 insertions(+), 12 deletions(-)
> > > 
> > > diff --git a/hw/pci.c b/hw/pci.c
> > > index 9639a32..f06e1da 100644
> > > --- a/hw/pci.c
> > > +++ b/hw/pci.c
> > > @@ -574,6 +574,16 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
> > >          pci_update_mappings(d);
> > >  }
> > >  
> > > +static PCIBus *pci_find_bus_from(PCIBus *from, int bus_num)
> > 
> > Why what is "from"? pci_find_parent_bus a better name?
> 
> Its intention is to go down from a given parent bus
> to find child bus of a given bus number, bus_num.
> The current implementation arranges PCIBus in a single linked list,
> and a single linked list doesn't represent pci bus topology well.
> So it may find a pci bus which isn't child of a given bus.

Sounds very messy. Let's try to define sane semantics, otherwise maybe
we don't want to factor this out in a function after all.

> So far it hasn't been a issue because only a single bus PCI.0 is supported.
> 
> Given that several people including me want multiple PCI bus,
> your question arises that the linked list should be changed/enhanced to
> some kind of tree structure to represent PCI bus topology accurately.
> Does it sound a good idea?

I won't be surprised if we need a tree to represent PCI bus topology.
But we already have it, don't we: each bus lists devices behind it, some
of these could be buses.

OTOH a list of all buses is currently used to look up device by bus
number.  Since there are only 256 possible buses, how about an array indexing
buses by bus number? Will be simpler and cleaner than what we have,
and the api would be pci_find_bus(int bus_num) with no confusing from?


> 
> > > +{
> > > +    PCIBus *s = from;
> > > +
> > > +    while (s && s->bus_num != bus_num)
> > 
> > No space after while.
> > 
> > > +        s = s->next;
> > > +
> > > +    return s;
> > > +}
> > > +
> > >  void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len)
> > >  {
> > >      PCIBus *s = opaque;
> > > @@ -585,8 +595,7 @@ void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len)
> > >                  addr, val, len);
> > >  #endif
> > >      bus_num = (addr >> 16) & 0xff;
> > > -    while (s && s->bus_num != bus_num)
> > > -        s = s->next;
> > > +    s = pci_find_bus_from(s, bus_num);
> > >      if (!s)
> > >          return;
> > >      pci_dev = s->devices[(addr >> 8) & 0xff];
> > > @@ -607,8 +616,7 @@ uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
> > >      uint32_t val;
> > >  
> > >      bus_num = (addr >> 16) & 0xff;
> > > -    while (s && s->bus_num != bus_num)
> > > -        s= s->next;
> > > +    s = pci_find_bus_from(s, bus_num);
> > >      if (!s)
> > >          goto fail;
> > >      pci_dev = s->devices[(addr >> 8) & 0xff];
> > > @@ -792,8 +800,7 @@ void pci_for_each_device(int bus_num, void (*fn)(PCIDevice *d))
> > >      PCIDevice *d;
> > >      int devfn;
> > >  
> > > -    while (bus && bus->bus_num != bus_num)
> > > -        bus = bus->next;
> > > +    bus = pci_find_bus_from(bus, bus_num);
> > >      if (bus) {
> > >          for(devfn = 0; devfn < 256; devfn++) {
> > >              d = bus->devices[devfn];
> > > @@ -891,12 +898,7 @@ static void pci_bridge_write_config(PCIDevice *d,
> > >  
> > >  PCIBus *pci_find_bus(int bus_num)
> > >  {
> > > -    PCIBus *bus = first_bus;
> > > -
> > > -    while (bus && bus->bus_num != bus_num)
> > > -        bus = bus->next;
> > > -
> > > -    return bus;
> > > +    return pci_find_bus_from(first_bus, bus_num);
> > >  }
> > >  
> > >  PCIDevice *pci_find_device(int bus_num, int slot, int function)
> > 
> 
> -- 
> yamahata

  reply	other threads:[~2009-10-01  6:30 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-15 11:15 [Qemu-devel] [PATCH 0/9] pci: pcie host and mmcfg support Isaku Yamahata
2009-07-15 11:15 ` [Qemu-devel] [PATCH 1/9] pci: fix PCI_DPRINTF() wrt variadic macro Isaku Yamahata
2009-09-30 11:36   ` Michael S. Tsirkin
2009-07-15 11:15 ` [Qemu-devel] [PATCH 2/9] pci.c: use appropriate PRIs in PCI_DPRINTF() Isaku Yamahata
2009-09-30 11:37   ` Michael S. Tsirkin
2009-09-30 11:58   ` Michael S. Tsirkin
2009-07-15 11:15 ` [Qemu-devel] [PATCH 3/9] pci: define a constant to represent a unmapped bar and use it Isaku Yamahata
2009-09-30 11:37   ` Michael S. Tsirkin
2009-07-15 11:15 ` [Qemu-devel] [PATCH 4/9] pci: use uint64_t for bar addr and size instead of uint32_t Isaku Yamahata
2009-09-30 11:41   ` Michael S. Tsirkin
2009-09-30 15:25     ` malc
2009-09-30 16:15       ` Michael S. Tsirkin
2009-09-30 16:51         ` malc
2009-09-30 17:26           ` Michael S. Tsirkin
2009-09-30 17:59             ` malc
2009-10-01  5:33               ` Michael S. Tsirkin
2009-10-01 12:15                 ` malc
2009-10-01 12:26                   ` Michael S. Tsirkin
2009-10-01 12:45                     ` malc
2009-10-01 13:54                   ` Anthony Liguori
2009-10-01 18:46                     ` malc
2009-10-01 23:41                   ` Jamie Lokier
2009-10-01  3:44     ` Isaku Yamahata
2009-07-15 11:15 ` [Qemu-devel] [PATCH 5/9] pci: 64bit bar support Isaku Yamahata
2009-09-30 11:43   ` Michael S. Tsirkin
2009-10-06  9:33   ` Michael S. Tsirkin
2009-07-15 11:15 ` [Qemu-devel] [PATCH 6/9] pci.c: factor out while(bus) bus->next loop logic into pci_find_bus_from() Isaku Yamahata
2009-09-30 11:45   ` Michael S. Tsirkin
2009-10-01  3:29     ` Isaku Yamahata
2009-10-01  6:28       ` Michael S. Tsirkin [this message]
2009-10-01  7:00         ` Isaku Yamahata
2009-10-01  7:14           ` Michael S. Tsirkin
2009-10-01 11:24         ` Gerd Hoffmann
2009-07-15 11:15 ` [Qemu-devel] [PATCH 7/9] pci: factor out the logic to get pci device from address Isaku Yamahata
2009-09-30 11:30   ` Michael S. Tsirkin
2009-10-01  3:59     ` Isaku Yamahata
2009-07-15 11:15 ` [Qemu-devel] [PATCH 8/9] pci_host.h: split non-inline static function in pci_host.h into pci_host_c.h Isaku Yamahata
2009-09-30 11:47   ` Michael S. Tsirkin
2009-10-01  4:13     ` Isaku Yamahata
2009-07-15 11:15 ` [Qemu-devel] [PATCH 9/9] [RFC] pci: pcie host and mmcfg support Isaku Yamahata
2009-10-06  9:32   ` Michael S. Tsirkin

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=20091001062826.GD5142@redhat.com \
    --to=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=yamahata@valinux.co.jp \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).