All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Daney <ddaney@caviumnetworks.com>
To: Arnd Bergmann <arnd@arndb.de>
Cc: <linux-arm-kernel@lists.infradead.org>,
	David Daney <ddaney.cavm@gmail.com>,
	<linux-kernel@vger.kernel.org>,
	Bjorn Helgaas <bhelgaas@google.com>, <linux-pci@vger.kernel.org>,
	Will Deacon <will.deacon@arm.com>,
	Rob Herring <robh+dt@kernel.org>, Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>, <devicetree@vger.kernel.org>,
	Marc Zyngier <marc.zyngier@arm.com>,
	"David Daney" <david.daney@cavium.com>
Subject: Re: [PATCH v3 3/6] PCI: generic: Quit clobbering our pci_ops.
Date: Wed, 23 Sep 2015 08:56:59 -0700	[thread overview]
Message-ID: <5602CBCB.4030605@caviumnetworks.com> (raw)
In-Reply-To: <1729894.341fjYUAKl@wuerfel>

On 09/23/2015 01:21 AM, Arnd Bergmann wrote:
> On Tuesday 22 September 2015 16:49:14 David Daney wrote:
>> From: David Daney <david.daney@cavium.com>
>>
>> The pci-host-generic driver keeps a global struct pci_ops which it
>> then patches with the .map_bus method appropriate for the bus device.
>> A problem arises when the driver is used for two different types of
>> bus devices, the .map_bus method for the last device probed clobbers
>> the method for all previous devices.  The result, only the last bus
>> device probed has the proper .map_bus, and the others fail.
>>
>> Move the struct pci_ops into the bus specific structure, and
>> initialize it when the bus device is probed.  Keep a copy of the
>> gen_pci_cfg_bus_ops structure, instead of a pointer to a global copy,
>
> This is a very useful change.
>
>> to future proof against the addition of bus specific elements to
>> struct pci_ops.
>
> but I don't like this part. We should just not have bus specific
> elements in pci_ops. We don't really have that here either, except
> that the gen_pci driver had a hack for reusing the same operations
> for things that are actually different.
>
> It's an established practice that anything named '*_operations' is
> meant to be constant and ideally defined as 'static const ... *_ops;'
> in the driver. We could try to enforce this better by marking
> bus->ops as 'const' and changing all the instances of this structure
> accordingly.
>
>> @@ -65,7 +65,11 @@ static void __iomem *gen_pci_map_cfg_bus_cam(struct pci_bus *bus,
>>
>>   static struct gen_pci_cfg_bus_ops gen_pci_cfg_cam_bus_ops = {
>>   	.bus_shift	= 16,
>> -	.map_bus	= gen_pci_map_cfg_bus_cam,
>> +	.ops		= {
>> +		.map_bus	= gen_pci_map_cfg_bus_cam,
>> +		.read		= pci_generic_config_read,
>> +		.write		= pci_generic_config_write,
>> +	}
>>   };
>
> So this is good. We could in theory unify the map_bus functions
> like this now:
>
> static void __iomem *gen_pci_map_cfg_bus(struct pci_bus *bus,
>                                           unsigned int devfn,
>                                           int where)
> {
>          struct gen_pci *pci = bus->sysdata;
> 	struct gen_pci_cfg_bus_ops *ops;
>          resource_size_t idx;
>
> 	ops = container_of(bus->ops, struct gen_pci_cfg_bus_ops, ops);
> 	idx = bus->number - pci->cfg.bus_range->start;
>
>          return pci->cfg.win[idx] + ((devfn << ops->dev_shift) | where);
> }
>
> Not sure if that improves clarity or not, up to Will.
>
>> @@ -234,8 +237,7 @@ static int gen_pci_probe(struct platform_device *pdev)
>>   	}
>>
>>   	of_id = of_match_node(gen_pci_of_match, np);
>> -	pci->cfg.ops = of_id->data;
>> +	pci->cfg.ops = *(struct gen_pci_cfg_bus_ops *)of_id->data;
>
> This is the part that grabbed my attention, we should not do it like this.
>

I will consider changing this so that a structure copy is not used, 
perhaps as you suggest above.

David Daney.


> 	Arnd
>


WARNING: multiple messages have this Message-ID (diff)
From: ddaney@caviumnetworks.com (David Daney)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 3/6] PCI: generic: Quit clobbering our pci_ops.
Date: Wed, 23 Sep 2015 08:56:59 -0700	[thread overview]
Message-ID: <5602CBCB.4030605@caviumnetworks.com> (raw)
In-Reply-To: <1729894.341fjYUAKl@wuerfel>

On 09/23/2015 01:21 AM, Arnd Bergmann wrote:
> On Tuesday 22 September 2015 16:49:14 David Daney wrote:
>> From: David Daney <david.daney@cavium.com>
>>
>> The pci-host-generic driver keeps a global struct pci_ops which it
>> then patches with the .map_bus method appropriate for the bus device.
>> A problem arises when the driver is used for two different types of
>> bus devices, the .map_bus method for the last device probed clobbers
>> the method for all previous devices.  The result, only the last bus
>> device probed has the proper .map_bus, and the others fail.
>>
>> Move the struct pci_ops into the bus specific structure, and
>> initialize it when the bus device is probed.  Keep a copy of the
>> gen_pci_cfg_bus_ops structure, instead of a pointer to a global copy,
>
> This is a very useful change.
>
>> to future proof against the addition of bus specific elements to
>> struct pci_ops.
>
> but I don't like this part. We should just not have bus specific
> elements in pci_ops. We don't really have that here either, except
> that the gen_pci driver had a hack for reusing the same operations
> for things that are actually different.
>
> It's an established practice that anything named '*_operations' is
> meant to be constant and ideally defined as 'static const ... *_ops;'
> in the driver. We could try to enforce this better by marking
> bus->ops as 'const' and changing all the instances of this structure
> accordingly.
>
>> @@ -65,7 +65,11 @@ static void __iomem *gen_pci_map_cfg_bus_cam(struct pci_bus *bus,
>>
>>   static struct gen_pci_cfg_bus_ops gen_pci_cfg_cam_bus_ops = {
>>   	.bus_shift	= 16,
>> -	.map_bus	= gen_pci_map_cfg_bus_cam,
>> +	.ops		= {
>> +		.map_bus	= gen_pci_map_cfg_bus_cam,
>> +		.read		= pci_generic_config_read,
>> +		.write		= pci_generic_config_write,
>> +	}
>>   };
>
> So this is good. We could in theory unify the map_bus functions
> like this now:
>
> static void __iomem *gen_pci_map_cfg_bus(struct pci_bus *bus,
>                                           unsigned int devfn,
>                                           int where)
> {
>          struct gen_pci *pci = bus->sysdata;
> 	struct gen_pci_cfg_bus_ops *ops;
>          resource_size_t idx;
>
> 	ops = container_of(bus->ops, struct gen_pci_cfg_bus_ops, ops);
> 	idx = bus->number - pci->cfg.bus_range->start;
>
>          return pci->cfg.win[idx] + ((devfn << ops->dev_shift) | where);
> }
>
> Not sure if that improves clarity or not, up to Will.
>
>> @@ -234,8 +237,7 @@ static int gen_pci_probe(struct platform_device *pdev)
>>   	}
>>
>>   	of_id = of_match_node(gen_pci_of_match, np);
>> -	pci->cfg.ops = of_id->data;
>> +	pci->cfg.ops = *(struct gen_pci_cfg_bus_ops *)of_id->data;
>
> This is the part that grabbed my attention, we should not do it like this.
>

I will consider changing this so that a structure copy is not used, 
perhaps as you suggest above.

David Daney.


> 	Arnd
>

WARNING: multiple messages have this Message-ID (diff)
From: David Daney <ddaney@caviumnetworks.com>
To: Arnd Bergmann <arnd@arndb.de>
Cc: linux-arm-kernel@lists.infradead.org,
	David Daney <ddaney.cavm@gmail.com>,
	linux-kernel@vger.kernel.org, Bjorn Helgaas <bhelgaas@google.com>,
	linux-pci@vger.kernel.org, Will Deacon <will.deacon@arm.com>,
	Rob Herring <robh+dt@kernel.org>, Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>,
	devicetree@vger.kernel.org, Marc Zyngier <marc.zyngier@arm.com>,
	David Daney <david.daney@cavium.com>
Subject: Re: [PATCH v3 3/6] PCI: generic: Quit clobbering our pci_ops.
Date: Wed, 23 Sep 2015 08:56:59 -0700	[thread overview]
Message-ID: <5602CBCB.4030605@caviumnetworks.com> (raw)
In-Reply-To: <1729894.341fjYUAKl@wuerfel>

On 09/23/2015 01:21 AM, Arnd Bergmann wrote:
> On Tuesday 22 September 2015 16:49:14 David Daney wrote:
>> From: David Daney <david.daney@cavium.com>
>>
>> The pci-host-generic driver keeps a global struct pci_ops which it
>> then patches with the .map_bus method appropriate for the bus device.
>> A problem arises when the driver is used for two different types of
>> bus devices, the .map_bus method for the last device probed clobbers
>> the method for all previous devices.  The result, only the last bus
>> device probed has the proper .map_bus, and the others fail.
>>
>> Move the struct pci_ops into the bus specific structure, and
>> initialize it when the bus device is probed.  Keep a copy of the
>> gen_pci_cfg_bus_ops structure, instead of a pointer to a global copy,
>
> This is a very useful change.
>
>> to future proof against the addition of bus specific elements to
>> struct pci_ops.
>
> but I don't like this part. We should just not have bus specific
> elements in pci_ops. We don't really have that here either, except
> that the gen_pci driver had a hack for reusing the same operations
> for things that are actually different.
>
> It's an established practice that anything named '*_operations' is
> meant to be constant and ideally defined as 'static const ... *_ops;'
> in the driver. We could try to enforce this better by marking
> bus->ops as 'const' and changing all the instances of this structure
> accordingly.
>
>> @@ -65,7 +65,11 @@ static void __iomem *gen_pci_map_cfg_bus_cam(struct pci_bus *bus,
>>
>>   static struct gen_pci_cfg_bus_ops gen_pci_cfg_cam_bus_ops = {
>>   	.bus_shift	= 16,
>> -	.map_bus	= gen_pci_map_cfg_bus_cam,
>> +	.ops		= {
>> +		.map_bus	= gen_pci_map_cfg_bus_cam,
>> +		.read		= pci_generic_config_read,
>> +		.write		= pci_generic_config_write,
>> +	}
>>   };
>
> So this is good. We could in theory unify the map_bus functions
> like this now:
>
> static void __iomem *gen_pci_map_cfg_bus(struct pci_bus *bus,
>                                           unsigned int devfn,
>                                           int where)
> {
>          struct gen_pci *pci = bus->sysdata;
> 	struct gen_pci_cfg_bus_ops *ops;
>          resource_size_t idx;
>
> 	ops = container_of(bus->ops, struct gen_pci_cfg_bus_ops, ops);
> 	idx = bus->number - pci->cfg.bus_range->start;
>
>          return pci->cfg.win[idx] + ((devfn << ops->dev_shift) | where);
> }
>
> Not sure if that improves clarity or not, up to Will.
>
>> @@ -234,8 +237,7 @@ static int gen_pci_probe(struct platform_device *pdev)
>>   	}
>>
>>   	of_id = of_match_node(gen_pci_of_match, np);
>> -	pci->cfg.ops = of_id->data;
>> +	pci->cfg.ops = *(struct gen_pci_cfg_bus_ops *)of_id->data;
>
> This is the part that grabbed my attention, we should not do it like this.
>

I will consider changing this so that a structure copy is not used, 
perhaps as you suggest above.

David Daney.


> 	Arnd
>

  reply	other threads:[~2015-09-23 15:57 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-22 23:49 [PATCH v3 0/6] PCI: generic: Misc. bug fixes/enhancements David Daney
2015-09-22 23:49 ` David Daney
2015-09-22 23:49 ` David Daney
2015-09-22 23:49 ` [PATCH v3 1/6] PCI: Add pci_bus_fixup_irqs() David Daney
2015-09-22 23:49   ` David Daney
2015-09-22 23:49 ` [PATCH v3 2/6] PCI: generic: Only fixup irqs for bus we are creating David Daney
2015-09-22 23:49   ` David Daney
2015-09-22 23:49 ` [PATCH v3 3/6] PCI: generic: Quit clobbering our pci_ops David Daney
2015-09-22 23:49   ` David Daney
2015-09-23  8:21   ` Arnd Bergmann
2015-09-23  8:21     ` Arnd Bergmann
2015-09-23 15:56     ` David Daney [this message]
2015-09-23 15:56       ` David Daney
2015-09-23 15:56       ` David Daney
2015-09-22 23:49 ` [PATCH v3 4/6] PCI: generic: Correct, and avoid overflow, in bus_max calculation David Daney
2015-09-22 23:49   ` David Daney
2015-09-23  8:01   ` Arnd Bergmann
2015-09-23  8:01     ` Arnd Bergmann
2015-09-23 15:50     ` David Daney
2015-09-23 15:50       ` David Daney
2015-09-23 15:50       ` David Daney
2015-09-23 19:35       ` Arnd Bergmann
2015-09-23 19:35         ` Arnd Bergmann
2015-09-23 19:35         ` Arnd Bergmann
2015-09-22 23:49 ` [PATCH v3 5/6] PCI: generic: Pass proper starting bus number to pci_scan_root_bus() David Daney
2015-09-22 23:49   ` David Daney
2015-09-22 23:49 ` [PATCH v3 6/6] PCI: generic: Claim device resources if PCI_PROBE_ONLY David Daney
2015-09-22 23:49   ` David Daney
2015-09-23  8:02 ` [PATCH v3 0/6] PCI: generic: Misc. bug fixes/enhancements Arnd Bergmann
2015-09-23  8:02   ` Arnd Bergmann
2015-09-23  8:02   ` Arnd Bergmann

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=5602CBCB.4030605@caviumnetworks.com \
    --to=ddaney@caviumnetworks.com \
    --cc=arnd@arndb.de \
    --cc=bhelgaas@google.com \
    --cc=david.daney@cavium.com \
    --cc=ddaney.cavm@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=galak@codeaurora.org \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=pawel.moll@arm.com \
    --cc=robh+dt@kernel.org \
    --cc=will.deacon@arm.com \
    /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.