2022-11-03 17:04:47

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 0/4] PCI: Add pci_dev_for_each_resource() helper and refactor bus one

Provide two new helper macros to iterate over PCI device resources and
convert users.

Looking at it, refactor existing pci_bus_for_each_resource() and convert
users accordingly.

This applies on top of this patch Mika sent out earlier:
https://lore.kernel.org/linux-pci/[email protected]/

Changelog v2:
- refactor to have two macros
- refactor existing pci_bus_for_each_resource() in the same way and
convert users

Andy Shevchenko (3):
PCI: Split pci_bus_for_each_resource_p() out of
pci_bus_for_each_resource()
EISA: Convert to use pci_bus_for_each_resource_p()
pcmcia: Convert to use pci_bus_for_each_resource_p()

Mika Westerberg (1):
PCI: Introduce pci_dev_for_each_resource()

.clang-format | 3 +++
arch/alpha/kernel/pci.c | 5 ++---
arch/arm/kernel/bios32.c | 16 ++++++-------
arch/mips/pci/pci-legacy.c | 3 +--
arch/powerpc/kernel/pci-common.c | 5 ++---
arch/sparc/kernel/leon_pci.c | 5 ++---
arch/sparc/kernel/pci.c | 10 ++++-----
arch/sparc/kernel/pcic.c | 5 ++---
drivers/eisa/pci_eisa.c | 4 ++--
drivers/pci/bus.c | 7 +++---
drivers/pci/hotplug/shpchp_sysfs.c | 8 +++----
drivers/pci/pci.c | 5 ++---
drivers/pci/probe.c | 2 +-
drivers/pci/remove.c | 5 ++---
drivers/pci/setup-bus.c | 36 ++++++++++++------------------
drivers/pci/setup-res.c | 4 +---
drivers/pci/xen-pcifront.c | 4 +---
drivers/pcmcia/rsrc_nonstatic.c | 9 +++-----
drivers/pcmcia/yenta_socket.c | 3 +--
include/linux/pci.h | 25 +++++++++++++++++----
20 files changed, 78 insertions(+), 86 deletions(-)

--
2.35.1



2022-11-03 17:04:49

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 3/4] EISA: Convert to use pci_bus_for_each_resource_p()

The pci_bus_for_each_resource_p() hides the iterator loop since
it may be not used otherwise. With this, we may drop that iterator
variable definition.

Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/eisa/pci_eisa.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/eisa/pci_eisa.c b/drivers/eisa/pci_eisa.c
index 930c2332c3c4..907b86384396 100644
--- a/drivers/eisa/pci_eisa.c
+++ b/drivers/eisa/pci_eisa.c
@@ -20,8 +20,8 @@ static struct eisa_root_device pci_eisa_root;

static int __init pci_eisa_init(struct pci_dev *pdev)
{
- int rc, i;
struct resource *res, *bus_res = NULL;
+ int rc;

if ((rc = pci_enable_device (pdev))) {
dev_err(&pdev->dev, "Could not enable device\n");
@@ -38,7 +38,7 @@ static int __init pci_eisa_init(struct pci_dev *pdev)
* eisa_root_register() can only deal with a single io port resource,
* so we use the first valid io port resource.
*/
- pci_bus_for_each_resource(pdev->bus, res, i)
+ pci_bus_for_each_resource_p(pdev->bus, res)
if (res && (res->flags & IORESOURCE_IO)) {
bus_res = res;
break;
--
2.35.1


2022-11-03 17:05:50

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

The pci_bus_for_each_resource_p() hides the iterator loop since
it may be not used otherwise. With this, we may drop that iterator
variable definition.

Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/pcmcia/rsrc_nonstatic.c | 9 +++------
drivers/pcmcia/yenta_socket.c | 3 +--
2 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c
index ad1141fddb4c..9d92d4bb6239 100644
--- a/drivers/pcmcia/rsrc_nonstatic.c
+++ b/drivers/pcmcia/rsrc_nonstatic.c
@@ -934,7 +934,7 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long
static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
{
struct resource *res;
- int i, done = 0;
+ int done = 0;

if (!s->cb_dev || !s->cb_dev->bus)
return -ENODEV;
@@ -960,12 +960,9 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
*/
if (s->cb_dev->bus->number == 0)
return -EINVAL;
-
- for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
- res = s->cb_dev->bus->resource[i];
-#else
- pci_bus_for_each_resource(s->cb_dev->bus, res, i) {
#endif
+
+ pci_bus_for_each_resource_p(s->cb_dev->bus, res) {
if (!res)
continue;

diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
index 3966a6ceb1ac..b200f2b99a7a 100644
--- a/drivers/pcmcia/yenta_socket.c
+++ b/drivers/pcmcia/yenta_socket.c
@@ -673,9 +673,8 @@ static int yenta_search_res(struct yenta_socket *socket, struct resource *res,
u32 min)
{
struct resource *root;
- int i;

- pci_bus_for_each_resource(socket->dev->bus, root, i) {
+ pci_bus_for_each_resource_p(socket->dev->bus, root) {
if (!root)
continue;

--
2.35.1


2022-11-03 17:07:23

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 1/4] PCI: Introduce pci_dev_for_each_resource()

From: Mika Westerberg <[email protected]>

Instead of open-coding it everywhere introduce a tiny helper that can be
used to iterate over each resource of a PCI device, and convert the most
obvious users into it.

While at it drop doubled empty line before pdev_sort_resources().

No functional changes intended.

Suggested-by: Andy Shevchenko <[email protected]>
Signed-off-by: Mika Westerberg <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
.clang-format | 2 ++
arch/alpha/kernel/pci.c | 5 ++---
arch/arm/kernel/bios32.c | 16 +++++++---------
arch/mips/pci/pci-legacy.c | 3 +--
arch/powerpc/kernel/pci-common.c | 5 ++---
arch/sparc/kernel/leon_pci.c | 5 ++---
arch/sparc/kernel/pci.c | 10 ++++------
arch/sparc/kernel/pcic.c | 5 ++---
drivers/pci/remove.c | 5 ++---
drivers/pci/setup-bus.c | 26 ++++++++++----------------
drivers/pci/setup-res.c | 4 +---
drivers/pci/xen-pcifront.c | 4 +---
include/linux/pci.h | 11 +++++++++++
13 files changed, 47 insertions(+), 54 deletions(-)

diff --git a/.clang-format b/.clang-format
index f98481a53ea8..08d579fea6cf 100644
--- a/.clang-format
+++ b/.clang-format
@@ -520,6 +520,8 @@ ForEachMacros:
- 'of_property_for_each_string'
- 'of_property_for_each_u32'
- 'pci_bus_for_each_resource'
+ - 'pci_dev_for_each_resource'
+ - 'pci_dev_for_each_resource_p'
- 'pci_doe_for_each_off'
- 'pcl_for_each_chunk'
- 'pcl_for_each_segment'
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c
index 64fbfb0763b2..4458eb7f44f0 100644
--- a/arch/alpha/kernel/pci.c
+++ b/arch/alpha/kernel/pci.c
@@ -288,11 +288,10 @@ pcibios_claim_one_bus(struct pci_bus *b)
struct pci_bus *child_bus;

list_for_each_entry(dev, &b->devices, bus_list) {
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, r, i) {
if (r->parent || !r->start || !r->flags)
continue;
if (pci_has_flag(PCI_PROBE_ONLY) ||
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index e7ef2b5bea9c..5254734b23e6 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -142,15 +142,15 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940F,
*/
static void pci_fixup_dec21285(struct pci_dev *dev)
{
- int i;
-
if (dev->devfn == 0) {
+ struct resource *r;
+
dev->class &= 0xff;
dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- dev->resource[i].start = 0;
- dev->resource[i].end = 0;
- dev->resource[i].flags = 0;
+ pci_dev_for_each_resource_p(dev, r) {
+ r->start = 0;
+ r->end = 0;
+ r->flags = 0;
}
}
}
@@ -162,13 +162,11 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, pci_fixup_d
static void pci_fixup_ide_bases(struct pci_dev *dev)
{
struct resource *r;
- int i;

if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
return;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- r = dev->resource + i;
+ pci_dev_for_each_resource_p(dev, r) {
if ((r->start & ~0x80) == 0x374) {
r->start |= 2;
r->end = r->start;
diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c
index 468722c8a5c6..ec2567f8efd8 100644
--- a/arch/mips/pci/pci-legacy.c
+++ b/arch/mips/pci/pci-legacy.c
@@ -249,12 +249,11 @@ static int pcibios_enable_resources(struct pci_dev *dev, int mask)

pci_read_config_word(dev, PCI_COMMAND, &cmd);
old_cmd = cmd;
- for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
+ pci_dev_for_each_resource(dev, r, idx) {
/* Only set up the requested stuff */
if (!(mask & (1<<idx)))
continue;

- r = &dev->resource[idx];
if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
continue;
if ((idx == PCI_ROM_RESOURCE) &&
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index d67cf79bf5d0..8ddcfa6bcb50 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -1452,11 +1452,10 @@ void pcibios_claim_one_bus(struct pci_bus *bus)
struct pci_bus *child_bus;

list_for_each_entry(dev, &bus->devices, bus_list) {
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, r, i) {
if (r->parent || !r->start || !r->flags)
continue;

diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c
index e5e5ff6b9a5c..b6663a3fbae9 100644
--- a/arch/sparc/kernel/leon_pci.c
+++ b/arch/sparc/kernel/leon_pci.c
@@ -62,15 +62,14 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info)

int pcibios_enable_device(struct pci_dev *dev, int mask)
{
+ struct resource *res;
u16 cmd, oldcmd;
int i;

pci_read_config_word(dev, PCI_COMMAND, &cmd);
oldcmd = cmd;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, res, i) {
/* Only set up the requested stuff */
if (!(mask & (1<<i)))
continue;
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index cb1ef25116e9..a948a49817c7 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -663,11 +663,10 @@ static void pci_claim_bus_resources(struct pci_bus *bus)
struct pci_dev *dev;

list_for_each_entry(dev, &bus->devices, bus_list) {
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, r, i) {
if (r->parent || !r->start || !r->flags)
continue;

@@ -724,15 +723,14 @@ struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,

int pcibios_enable_device(struct pci_dev *dev, int mask)
{
+ struct resource *res;
u16 cmd, oldcmd;
int i;

pci_read_config_word(dev, PCI_COMMAND, &cmd);
oldcmd = cmd;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, res, i) {
/* Only set up the requested stuff */
if (!(mask & (1<<i)))
continue;
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c
index ee4c9a9a171c..25fe0a061732 100644
--- a/arch/sparc/kernel/pcic.c
+++ b/arch/sparc/kernel/pcic.c
@@ -643,15 +643,14 @@ void pcibios_fixup_bus(struct pci_bus *bus)

int pcibios_enable_device(struct pci_dev *dev, int mask)
{
+ struct resource *res;
u16 cmd, oldcmd;
int i;

pci_read_config_word(dev, PCI_COMMAND, &cmd);
oldcmd = cmd;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, res, i) {
/* Only set up the requested stuff */
if (!(mask & (1<<i)))
continue;
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c
index 4c54c75050dc..825ae3cffead 100644
--- a/drivers/pci/remove.c
+++ b/drivers/pci/remove.c
@@ -5,10 +5,9 @@

static void pci_free_resources(struct pci_dev *dev)
{
- int i;
+ struct resource *res;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = dev->resource + i;
+ pci_dev_for_each_resource_p(dev, res) {
if (res->parent)
release_resource(res);
}
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index e512f9ecb9d0..336d6e6ef76a 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -124,20 +124,17 @@ static resource_size_t get_res_add_align(struct list_head *head,
return dev_res ? dev_res->min_align : 0;
}

-
/* Sort resources by alignment */
static void pdev_sort_resources(struct pci_dev *dev, struct list_head *head)
{
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r;
+ pci_dev_for_each_resource(dev, r, i) {
struct pci_dev_resource *dev_res, *tmp;
resource_size_t r_align;
struct list_head *n;

- r = &dev->resource[i];
-
if (r->flags & IORESOURCE_PCI_FIXED)
continue;

@@ -895,10 +892,9 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size,

min_align = window_alignment(bus, IORESOURCE_IO);
list_for_each_entry(dev, &bus->devices, bus_list) {
- int i;
+ struct resource *r;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
+ pci_dev_for_each_resource_p(dev, r) {
unsigned long r_size;

if (r->parent || !(r->flags & IORESOURCE_IO))
@@ -1014,10 +1010,10 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
size = 0;

list_for_each_entry(dev, &bus->devices, bus_list) {
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
+ pci_dev_for_each_resource(dev, r, i) {
resource_size_t r_size;

if (r->parent || (r->flags & IORESOURCE_PCI_FIXED) ||
@@ -1358,11 +1354,10 @@ static void assign_fixed_resource_on_bus(struct pci_bus *b, struct resource *r)
*/
static void pdev_assign_fixed_resources(struct pci_dev *dev)
{
- int i;
+ struct resource *r;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+ pci_dev_for_each_resource_p(dev, r) {
struct pci_bus *b;
- struct resource *r = &dev->resource[i];

if (r->parent || !(r->flags & IORESOURCE_PCI_FIXED) ||
!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
@@ -1845,7 +1840,7 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,
* distributing the rest.
*/
list_for_each_entry(dev, &bus->devices, bus_list) {
- int i;
+ struct resource *dev_res;

if (dev == bridge)
continue;
@@ -1857,8 +1852,7 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,
if (!dev->multifunction)
return;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- const struct resource *dev_res = &dev->resource[i];
+ pci_dev_for_each_resource_p(dev, dev_res) {
resource_size_t dev_sz;
struct resource *b_res;

diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index b492e67c3d87..967f9a758923 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -484,12 +484,10 @@ int pci_enable_resources(struct pci_dev *dev, int mask)
pci_read_config_word(dev, PCI_COMMAND, &cmd);
old_cmd = cmd;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+ pci_dev_for_each_resource(dev, r, i) {
if (!(mask & (1 << i)))
continue;

- r = &dev->resource[i];
-
if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
continue;
if ((i == PCI_ROM_RESOURCE) &&
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
index 7378e2f3e525..ce485ef59656 100644
--- a/drivers/pci/xen-pcifront.c
+++ b/drivers/pci/xen-pcifront.c
@@ -390,9 +390,7 @@ static int pcifront_claim_resource(struct pci_dev *dev, void *data)
int i;
struct resource *r;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- r = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, r, i) {
if (!r->parent && r->start && r->flags) {
dev_info(&pdev->xdev->dev, "claiming resource %s/%d\n",
pci_name(dev), i);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 2bda4a4e47e8..3940435fa90a 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1407,6 +1407,17 @@ int pci_request_selected_regions(struct pci_dev *, int, const char *);
int pci_request_selected_regions_exclusive(struct pci_dev *, int, const char *);
void pci_release_selected_regions(struct pci_dev *, int);

+#define __pci_dev_for_each_resource(dev, res, __i, vartype) \
+ for (vartype __i = 0; \
+ res = &(dev)->resource[__i], __i < PCI_NUM_RESOURCES; \
+ __i++)
+
+#define pci_dev_for_each_resource(dev, res, i) \
+ __pci_dev_for_each_resource(dev, res, i, )
+
+#define pci_dev_for_each_resource_p(dev, res) \
+ __pci_dev_for_each_resource(dev, res, i, unsigned int)
+
/* drivers/pci/bus.c */
void pci_add_resource(struct list_head *resources, struct resource *res);
void pci_add_resource_offset(struct list_head *resources, struct resource *res,
--
2.35.1


2022-11-03 17:27:43

by Dominik Brodowski

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

Am Thu, Nov 03, 2022 at 06:46:44PM +0200 schrieb Andy Shevchenko:
> The pci_bus_for_each_resource_p() hides the iterator loop since
> it may be not used otherwise. With this, we may drop that iterator
> variable definition.

Thanks for your patch!

> diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c
> index ad1141fddb4c..9d92d4bb6239 100644
> --- a/drivers/pcmcia/rsrc_nonstatic.c
> +++ b/drivers/pcmcia/rsrc_nonstatic.c
> @@ -934,7 +934,7 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long
> static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
> {
> struct resource *res;
> - int i, done = 0;
> + int done = 0;
>
> if (!s->cb_dev || !s->cb_dev->bus)
> return -ENODEV;
> @@ -960,12 +960,9 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
> */
> if (s->cb_dev->bus->number == 0)
> return -EINVAL;
> -
> - for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
> - res = s->cb_dev->bus->resource[i];
> -#else
> - pci_bus_for_each_resource(s->cb_dev->bus, res, i) {
> #endif
> +
> + pci_bus_for_each_resource_p(s->cb_dev->bus, res) {
> if (!res)
> continue;

Doesn't this remove the proper iterator for X86? Even if that is the right
thing to do, it needs an explict explanation.

>
> diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
> index 3966a6ceb1ac..b200f2b99a7a 100644
> --- a/drivers/pcmcia/yenta_socket.c
> +++ b/drivers/pcmcia/yenta_socket.c
> @@ -673,9 +673,8 @@ static int yenta_search_res(struct yenta_socket *socket, struct resource *res,
> u32 min)
> {
> struct resource *root;
> - int i;
>
> - pci_bus_for_each_resource(socket->dev->bus, root, i) {
> + pci_bus_for_each_resource_p(socket->dev->bus, root) {
> if (!root)
> continue;
>

That looks fine!

Thanks,
Dominik

2022-11-03 17:31:28

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

On Thu, Nov 03, 2022 at 06:03:24PM +0100, Dominik Brodowski wrote:
> Am Thu, Nov 03, 2022 at 06:46:44PM +0200 schrieb Andy Shevchenko:

...

> > -
> > - for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
> > - res = s->cb_dev->bus->resource[i];
> > -#else
> > - pci_bus_for_each_resource(s->cb_dev->bus, res, i) {
> > #endif
> > +
> > + pci_bus_for_each_resource_p(s->cb_dev->bus, res) {
> > if (!res)
> > continue;
>
> Doesn't this remove the proper iterator for X86? Even if that is the right
> thing to do, it needs an explict explanation.

I dunno what was in 2010, but reading code now I have found no differences in
the logic on how resources are being iterated in these two pieces of code.

But fine, I will add a line to a commit message about this change.

Considering this is done, can you issue your conditional tag so I will
incorporate it in v3?

--
With Best Regards,
Andy Shevchenko



2022-11-03 17:35:13

by Dominik Brodowski

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

Am Thu, Nov 03, 2022 at 07:12:45PM +0200 schrieb Andy Shevchenko:
> On Thu, Nov 03, 2022 at 06:03:24PM +0100, Dominik Brodowski wrote:
> > Am Thu, Nov 03, 2022 at 06:46:44PM +0200 schrieb Andy Shevchenko:
>
> ...
>
> > > -
> > > - for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
> > > - res = s->cb_dev->bus->resource[i];
> > > -#else
> > > - pci_bus_for_each_resource(s->cb_dev->bus, res, i) {
> > > #endif
> > > +
> > > + pci_bus_for_each_resource_p(s->cb_dev->bus, res) {
> > > if (!res)
> > > continue;
> >
> > Doesn't this remove the proper iterator for X86? Even if that is the right
> > thing to do, it needs an explict explanation.
>
> I dunno what was in 2010, but reading code now I have found no differences in
> the logic on how resources are being iterated in these two pieces of code.
>
> But fine, I will add a line to a commit message about this change.
>
> Considering this is done, can you issue your conditional tag so I will
> incorporate it in v3?

Certainly, feel free to add

Acked-by: Dominik Brodowski <[email protected]>

Thanks,
Dominik

2022-11-03 18:23:22

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

On Thu, Nov 03, 2022 at 06:25:45PM +0100, Dominik Brodowski wrote:
> Am Thu, Nov 03, 2022 at 07:12:45PM +0200 schrieb Andy Shevchenko:
> > On Thu, Nov 03, 2022 at 06:03:24PM +0100, Dominik Brodowski wrote:

...

> > Considering this is done, can you issue your conditional tag so I will
> > incorporate it in v3?
>
> Certainly, feel free to add
>
> Acked-by: Dominik Brodowski <[email protected]>

Thank you for the review!

--
With Best Regards,
Andy Shevchenko



2022-11-03 19:07:53

by Krzysztof Wilczyński

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

Hello,

[...]
> > > -
> > > - for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
> > > - res = s->cb_dev->bus->resource[i];
> > > -#else
> > > - pci_bus_for_each_resource(s->cb_dev->bus, res, i) {
> > > #endif
> > > +
> > > + pci_bus_for_each_resource_p(s->cb_dev->bus, res) {
> > > if (!res)
> > > continue;
> >
> > Doesn't this remove the proper iterator for X86? Even if that is the right
> > thing to do, it needs an explict explanation.
>
> I dunno what was in 2010, but reading code now I have found no differences in
> the logic on how resources are being iterated in these two pieces of code.

This code is over a decade old (13 years old to be precise) and there was
something odd between Bjorn's and Jesse's patches, as per:

89a74ecccd1f ("PCI: add pci_bus_for_each_resource(), remove direct bus->resource[] refs")
cf26e8dc4194 ("pcmcia: do not autoadd root PCI bus resources")

> But fine, I will add a line to a commit message about this change.

I wouldn't, personally. The change you are proposing is self-explanatory
and somewhat in-line with what is there already - unless I am also reading
the current implementation wrong.

That said, Dominik is the maintainer of PCMCIA driver, so his is the last
word, so to speak. :)

> Considering this is done, can you issue your conditional tag so I will
> incorporate it in v3?

No need, really. Again, unless Dominik thinks otherwise.

Krzysztof

2022-11-03 19:18:27

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

On Thu, Nov 03, 2022 at 07:38:07PM +0100, Dominik Brodowski wrote:
> Am Fri, Nov 04, 2022 at 03:29:44AM +0900 schrieb Krzysztof Wilczyński:

...

> > That said, Dominik is the maintainer of PCMCIA driver, so his is the last
> > word, so to speak. :)
> >
> > > Considering this is done, can you issue your conditional tag so I will
> > > incorporate it in v3?
> >
> > No need, really. Again, unless Dominik thinks otherwise.
>
> Ah, thanks for the correction. Then v2 is perfectly fine.

I'm fine with either, thanks!

--
With Best Regards,
Andy Shevchenko



2022-11-03 19:31:07

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

On Fri, Nov 04, 2022 at 03:29:44AM +0900, Krzysztof Wilczyński wrote:

> > > > -
> > > > - for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
> > > > - res = s->cb_dev->bus->resource[i];
> > > > -#else
> > > > - pci_bus_for_each_resource(s->cb_dev->bus, res, i) {
> > > > #endif
> > > > +
> > > > + pci_bus_for_each_resource_p(s->cb_dev->bus, res) {
> > > > if (!res)
> > > > continue;
> > >
> > > Doesn't this remove the proper iterator for X86? Even if that is the right
> > > thing to do, it needs an explict explanation.
> >
> > I dunno what was in 2010, but reading code now I have found no differences in
> > the logic on how resources are being iterated in these two pieces of code.
>
> This code is over a decade old (13 years old to be precise) and there was
> something odd between Bjorn's and Jesse's patches, as per:
>
> 89a74ecccd1f ("PCI: add pci_bus_for_each_resource(), remove direct bus->resource[] refs")
> cf26e8dc4194 ("pcmcia: do not autoadd root PCI bus resources")

Yeah, thanks for pointing out to the other patch from the same 2010 year.
It seems the code was completely identical that time, now it uses more
sophisticated way of getting bus resources, but it's kept the same for
the resources under PCI_BRIDGE_RESOURCE_NUM threshold.

> > But fine, I will add a line to a commit message about this change.
>
> I wouldn't, personally. The change you are proposing is self-explanatory
> and somewhat in-line with what is there already - unless I am also reading
> the current implementation wrong.

But it wouldn't be harmful either.

> That said, Dominik is the maintainer of PCMCIA driver, so his is the last
> word, so to speak. :)
>
> > Considering this is done, can you issue your conditional tag so I will
> > incorporate it in v3?
>
> No need, really. Again, unless Dominik thinks otherwise.

I think that what is wanted to have to get his tag.

Thanks for review, both of you, guys!

--
With Best Regards,
Andy Shevchenko



2022-11-03 19:36:40

by Dominik Brodowski

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

Am Fri, Nov 04, 2022 at 03:29:44AM +0900 schrieb Krzysztof Wilczyński:
> Hello,
>
> [...]
> > > > -
> > > > - for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
> > > > - res = s->cb_dev->bus->resource[i];
> > > > -#else
> > > > - pci_bus_for_each_resource(s->cb_dev->bus, res, i) {
> > > > #endif
> > > > +
> > > > + pci_bus_for_each_resource_p(s->cb_dev->bus, res) {
> > > > if (!res)
> > > > continue;
> > >
> > > Doesn't this remove the proper iterator for X86? Even if that is the right
> > > thing to do, it needs an explict explanation.
> >
> > I dunno what was in 2010, but reading code now I have found no differences in
> > the logic on how resources are being iterated in these two pieces of code.
>
> This code is over a decade old (13 years old to be precise) and there was
> something odd between Bjorn's and Jesse's patches, as per:
>
> 89a74ecccd1f ("PCI: add pci_bus_for_each_resource(), remove direct bus->resource[] refs")
> cf26e8dc4194 ("pcmcia: do not autoadd root PCI bus resources")
>
> > But fine, I will add a line to a commit message about this change.
>
> I wouldn't, personally. The change you are proposing is self-explanatory
> and somewhat in-line with what is there already - unless I am also reading
> the current implementation wrong.
>
> That said, Dominik is the maintainer of PCMCIA driver, so his is the last
> word, so to speak. :)
>
> > Considering this is done, can you issue your conditional tag so I will
> > incorporate it in v3?
>
> No need, really. Again, unless Dominik thinks otherwise.

Ah, thanks for the correction. Then v2 is perfectly fine.

Thanks,
Dominik