All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <maz@kernel.org>
To: Kishon Vijay Abraham I <kishon@ti.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Bjorn Helgaas <bhelgaas@google.com>,
	<linux-kernel@vger.kernel.org>, <linux-pci@vger.kernel.org>,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	<lokeshvutla@ti.com>
Subject: Re: [PATCH 1/3] PCI: Add support in pci_walk_bus() to invoke callback matching RID
Date: Mon, 20 Sep 2021 19:01:50 +0100	[thread overview]
Message-ID: <87mto7unw1.wl-maz@kernel.org> (raw)
In-Reply-To: <49b2ba0c-c69d-266c-5db6-549fab031ffd@ti.com>

On Mon, 20 Sep 2021 15:28:52 +0100,
Kishon Vijay Abraham I <kishon@ti.com> wrote:
> 
> Hi Marc,
> 
> On 20/09/21 2:26 pm, Marc Zyngier wrote:
> > On Mon, 20 Sep 2021 07:41:31 +0100,
> > Kishon Vijay Abraham I <kishon@ti.com> wrote:
> >>
> >> Add two arguments to pci_walk_bus() [requestorID and mask], and add
> >> support in pci_walk_bus() to invoke the *callback* only for devices
> >> whose RequestorID after applying *mask* matches with *requestorID*
> >> passed as argument.
> >>
> >> This is done in preparation for calculating the total number of
> >> interrupt vectors that has to be supported by a specific GIC ITS device ID,
> >> specifically when "msi-map-mask" is populated in device tree.
> >>
> >> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
> >> ---
> >>  drivers/pci/bus.c   | 13 +++++++++----
> >>  include/linux/pci.h |  7 +++++--
> >>  2 files changed, 14 insertions(+), 6 deletions(-)
> >>
> >> diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
> >> index 3cef835b375f..e381e639ceaa 100644
> >> --- a/drivers/pci/bus.c
> >> +++ b/drivers/pci/bus.c
> >> @@ -358,10 +358,12 @@ void pci_bus_add_devices(const struct pci_bus *bus)
> >>  }
> >>  EXPORT_SYMBOL(pci_bus_add_devices);
> >>  
> >> -/** pci_walk_bus - walk devices on/under bus, calling callback.
> >> +/** __pci_walk_bus - walk devices on/under bus matching requestor ID, calling callback.
> >>   *  @top      bus whose devices should be walked
> >>   *  @cb       callback to be called for each device found
> >>   *  @userdata arbitrary pointer to be passed to callback.
> >> + *  @rid      Requestor ID that has to be matched for the callback to be invoked
> >> + *  @mask     Mask that has to be applied to pci_dev_id(), before compating it with @rid
> >>   *
> >>   *  Walk the given bus, including any bridged devices
> >>   *  on buses under this bus.  Call the provided callback
> >> @@ -371,8 +373,8 @@ EXPORT_SYMBOL(pci_bus_add_devices);
> >>   *  other than 0, we break out.
> >>   *
> >>   */
> >> -void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
> >> -		  void *userdata)
> >> +void __pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
> >> +		    void *userdata, u32 rid, u32 mask)
> >>  {
> >>  	struct pci_dev *dev;
> >>  	struct pci_bus *bus;
> >> @@ -399,13 +401,16 @@ void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
> >>  		} else
> >>  			next = dev->bus_list.next;
> >>  
> >> +		if (mask != 0xffff && ((pci_dev_id(dev) & mask) != rid))
> > 
> > Why the check for the mask? I also wonder whether the mask should apply
> > to the rid as well:
> 
> If the mask is set for all 16bits, then there is not going to be two PCIe
> devices which gets the same ITS device ID right? So no need for calculating
> total number of vectors?

Are we really arguing about the cost of a compare+branch vs some
readability? Or is there an actual correctness issue here?

> > 
> > 		if ((pci_dev_id(dev) & mask) != (rid & mask))

Because I think the above expression is a lot more readable (and
likely more correct) than what you are suggesting.

> > 
> >> +			continue;
> >> +
> >>  		retval = cb(dev, userdata);
> >>  		if (retval)
> >>  			break;
> >>  	}
> >>  	up_read(&pci_bus_sem);
> >>  }
> >> -EXPORT_SYMBOL_GPL(pci_walk_bus);
> >> +EXPORT_SYMBOL_GPL(__pci_walk_bus);
> >>  
> >>  struct pci_bus *pci_bus_get(struct pci_bus *bus)
> >>  {
> >> diff --git a/include/linux/pci.h b/include/linux/pci.h
> >> index cd8aa6fce204..8500fec56e50 100644
> >> --- a/include/linux/pci.h
> >> +++ b/include/linux/pci.h
> >> @@ -1473,14 +1473,17 @@ const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
> >>  int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,
> >>  		    int pass);
> >>  
> >> -void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
> >> -		  void *userdata);
> >> +void __pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
> >> +		    void *userdata, u32 rid, u32 mask);
> >>  int pci_cfg_space_size(struct pci_dev *dev);
> >>  unsigned char pci_bus_max_busnr(struct pci_bus *bus);
> >>  void pci_setup_bridge(struct pci_bus *bus);
> >>  resource_size_t pcibios_window_alignment(struct pci_bus *bus,
> >>  					 unsigned long type);
> >>  
> >> +#define pci_walk_bus(top, cb, userdata) \
> >> +	 __pci_walk_bus((top), (cb), (userdata), 0x0, 0xffff)
> > 
> > Please keep this close to the helper it replaces. I also really
> > dislike the use of this raw 0xffff. Don't we already have a named
> > constant that represents the mask for a RID?
> 
> I didn't find one on quick look but let me check.

Worse case, you could create your own.

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.

  reply	other threads:[~2021-09-20 18:51 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-20  6:41 [PATCH 0/3] PCI/gic-v3-its: Add support for same ITS device ID for multiple PCIe devices Kishon Vijay Abraham I
2021-09-20  6:41 ` [PATCH 1/3] PCI: Add support in pci_walk_bus() to invoke callback matching RID Kishon Vijay Abraham I
2021-09-20  8:56   ` Marc Zyngier
2021-09-20 14:28     ` Kishon Vijay Abraham I
2021-09-20 18:01       ` Marc Zyngier [this message]
2021-09-22  1:26         ` Kishon Vijay Abraham I
2021-09-27 14:45           ` Marc Zyngier
2021-09-27 14:56             ` Kishon Vijay Abraham I
2021-09-20  6:41 ` [PATCH 2/3] PCI: Export find_pci_root_bus() Kishon Vijay Abraham I
2021-09-20  8:37   ` Marc Zyngier
2021-09-20  6:41 ` [PATCH 3/3] irqchip/gic-v3-its: Include "msi-map-mask" for calculating nvecs Kishon Vijay Abraham I
2021-09-20  8:36   ` Marc Zyngier
2021-09-20  9:14 ` [PATCH 0/3] PCI/gic-v3-its: Add support for same ITS device ID for multiple PCIe devices Marc Zyngier
2021-09-20 11:22   ` Kishon Vijay Abraham I
2021-09-20 11:36     ` Marc Zyngier

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=87mto7unw1.wl-maz@kernel.org \
    --to=maz@kernel.org \
    --cc=bhelgaas@google.com \
    --cc=kishon@ti.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lokeshvutla@ti.com \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=tglx@linutronix.de \
    /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.