Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-25 Thread Luis R. Rodriguez
On Wed, Jun 25, 2014 at 2:51 PM, Luis R. Rodriguez  wrote:
> I'll go ahead and test this on the other
> distribution you mentioned you had issues, curious what could trigger a 
> timeout
> failure there that would be distribution specific.

I've tested this on SLE12 and see no issues as well.

  Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-25 Thread Luis R. Rodriguez
On Wed, Jun 25, 2014 at 04:00:19AM +0200, Luis R. Rodriguez wrote:
> On Wed, Jun 25, 2014 at 01:39:51AM +0200, Luis R. Rodriguez wrote:
> > On Tue, Jun 24, 2014 at 09:34:19AM -0700, Casey Leedom wrote:
> > > On 06/24/14 08:55, Casey Leedom wrote:
> > >> On 06/23/14 17:29, Luis R. Rodriguez wrote:
> > >   So I just did this for a normal modprobe (after the system is up):
> > >
> > > JiffiesProcess
> > > ---
> > >   0begin firmware load process
> > >   3request_firmware() returns
> > >   7start looking at the adapter
> > >  10finish reading the first sector of existing adapter firmware
> > >  26we've decided that we're going to upgrade the firmware
> > >  28actual firmware upgrade process starts
> > > 448we've finished halting the adapter processor
> > > 451we enter the firmware write routine
> > >   8,470we've finished erasing the firmware FLASH sectors
> > >  14,336write of new firmware is complete
> > >  14,340the new firmware load is complete
> > >  14,949the adapter processor has been restarted; new firmware running
> > >  14,952firmware upgrade process complete
> > >
> > > Maybe request_firmware() takes more time during the boot phase but as we 
> > > can see from the above timings, it's the actual firmware upgrade process 
> > > which takes the most time ...
> > 
> > OK so yeah the kernel work on request_firmware() isn't what takes over a
> > minute, its the actual hardware poking with the firmware it gets, and then
> > doing all the things you mentioned (a port for each netdevice, etc).  This 
> > is a
> > particularly interesting driver, apart from this I see some code about bus
> > master and loading firmware only once. Can you elaborate a bit on how that 
> > is
> > designed to work? Is it that only one PCI bus master device is allowed, and
> > that will do the request_firmware() for all PCI devices? I'm a bit confused
> > about this part, are we sure the bus master device will probe first? We can
> > surely keep all this code on the driver but it seems that if all these
> > complexitities might become the norm we should consider an API for sharing a
> > clean framework for it.

Casey here was the first series of questions.

> > As you noted the complexities on firmware loading, the number of different
> > netdevices one device might actually have would make it impractical to try
> > to do any completion on firmware on the ndo_init() with 
> > request_firmware_nowait().
> > Apart from a netdev specific API to handle all this cleanly, I wonder if
> > drivers like these merit getting placed by default onto the 
> > deferred_probe_active_list.
> > Typically this is triggered when drivers don't have a resource a subsystem
> > hasn't yet brought up, the driver returns -EPROBE_DEFER and the core driver
> > infrastructure later probes these devices on a secondary list. Greg?
> 
> Actually another option to clean this up is to use 
> platform_device_register_simple()
> after the initial firmware load and start poking at stuff there. Check out
> drivers/net/ethernet/8390/ne.c for an example with probe and all. I think
> that can help split up the code paths quite nicely and let you do your
> pre port thing there. Thoughts?

And here was the other one, what your thoughts are on splitting things up
a bit more for probe as ports part of a platform driver?

In the meantime I'll go and hunt down to see if there are any timeouts other
than the one embedded within request_firmware() (or udev if used). As we have
clarified now the 60s timeout is a timeout embedded as part of the filesystem
lookup of the firmware, not the actual loading of the firmware onto the device.

I for instance can introduce a huge delay on purpose right after
request_firmware() say 3 minutes on a test driver and it loads just fine, but
on my OpenSUSE 13.1 system. I'll go ahead and test this on the other
distribution you mentioned you had issues, curious what could trigger a timeout
failure there that would be distribution specific.

ergon:~ # ls > /lib/firmware/fake.bin

mcgrof@ergon ~/devel/fake-firmware-delay $ cat Makefile
all: modules

.PHONY: modules
modules:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

.PHONY: clean
clean:
make -C /lib/modules/$(shell uname -r)/build clean M=$(PWD)

obj-m += test.o

mcgrof@ergon ~/devel/fake-firmware-delay $ cat test.c
#include 
#include 
#include 
#include 
#include 

static struct platform_device *pdev;

static int __init test_init(void)
{
int ret;
const struct firmware *config;

pdev = platform_device_register_simple("fake-dev", 0, NULL, 0);
if (IS_ERR(pdev))
return PTR_ERR(pdev);

ret = request_firmware(, "fake.bin", >dev);
if (ret < 0) {
dev_set_uevent_suppress(>dev, true);
platform_device_unregister(pdev);

Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-25 Thread Luis R. Rodriguez
On Wed, Jun 25, 2014 at 04:00:19AM +0200, Luis R. Rodriguez wrote:
 On Wed, Jun 25, 2014 at 01:39:51AM +0200, Luis R. Rodriguez wrote:
  On Tue, Jun 24, 2014 at 09:34:19AM -0700, Casey Leedom wrote:
   On 06/24/14 08:55, Casey Leedom wrote:
   On 06/23/14 17:29, Luis R. Rodriguez wrote:
 So I just did this for a normal modprobe (after the system is up):
  
   JiffiesProcess
   ---
 0begin firmware load process
 3request_firmware() returns
 7start looking at the adapter
10finish reading the first sector of existing adapter firmware
26we've decided that we're going to upgrade the firmware
28actual firmware upgrade process starts
   448we've finished halting the adapter processor
   451we enter the firmware write routine
 8,470we've finished erasing the firmware FLASH sectors
14,336write of new firmware is complete
14,340the new firmware load is complete
14,949the adapter processor has been restarted; new firmware running
14,952firmware upgrade process complete
  
   Maybe request_firmware() takes more time during the boot phase but as we 
   can see from the above timings, it's the actual firmware upgrade process 
   which takes the most time ...
  
  OK so yeah the kernel work on request_firmware() isn't what takes over a
  minute, its the actual hardware poking with the firmware it gets, and then
  doing all the things you mentioned (a port for each netdevice, etc).  This 
  is a
  particularly interesting driver, apart from this I see some code about bus
  master and loading firmware only once. Can you elaborate a bit on how that 
  is
  designed to work? Is it that only one PCI bus master device is allowed, and
  that will do the request_firmware() for all PCI devices? I'm a bit confused
  about this part, are we sure the bus master device will probe first? We can
  surely keep all this code on the driver but it seems that if all these
  complexitities might become the norm we should consider an API for sharing a
  clean framework for it.

Casey here was the first series of questions.

  As you noted the complexities on firmware loading, the number of different
  netdevices one device might actually have would make it impractical to try
  to do any completion on firmware on the ndo_init() with 
  request_firmware_nowait().
  Apart from a netdev specific API to handle all this cleanly, I wonder if
  drivers like these merit getting placed by default onto the 
  deferred_probe_active_list.
  Typically this is triggered when drivers don't have a resource a subsystem
  hasn't yet brought up, the driver returns -EPROBE_DEFER and the core driver
  infrastructure later probes these devices on a secondary list. Greg?
 
 Actually another option to clean this up is to use 
 platform_device_register_simple()
 after the initial firmware load and start poking at stuff there. Check out
 drivers/net/ethernet/8390/ne.c for an example with probe and all. I think
 that can help split up the code paths quite nicely and let you do your
 pre port thing there. Thoughts?

And here was the other one, what your thoughts are on splitting things up
a bit more for probe as ports part of a platform driver?

In the meantime I'll go and hunt down to see if there are any timeouts other
than the one embedded within request_firmware() (or udev if used). As we have
clarified now the 60s timeout is a timeout embedded as part of the filesystem
lookup of the firmware, not the actual loading of the firmware onto the device.

I for instance can introduce a huge delay on purpose right after
request_firmware() say 3 minutes on a test driver and it loads just fine, but
on my OpenSUSE 13.1 system. I'll go ahead and test this on the other
distribution you mentioned you had issues, curious what could trigger a timeout
failure there that would be distribution specific.

ergon:~ # ls  /lib/firmware/fake.bin

mcgrof@ergon ~/devel/fake-firmware-delay $ cat Makefile
all: modules

.PHONY: modules
modules:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

.PHONY: clean
clean:
make -C /lib/modules/$(shell uname -r)/build clean M=$(PWD)

obj-m += test.o

mcgrof@ergon ~/devel/fake-firmware-delay $ cat test.c
#include linux/kernel.h
#include linux/module.h
#include linux/firmware.h
#include linux/platform_device.h
#include linux/delay.h

static struct platform_device *pdev;

static int __init test_init(void)
{
int ret;
const struct firmware *config;

pdev = platform_device_register_simple(fake-dev, 0, NULL, 0);
if (IS_ERR(pdev))
return PTR_ERR(pdev);

ret = request_firmware(config, fake.bin, pdev-dev);
if (ret  0) {
dev_set_uevent_suppress(pdev-dev, true);
platform_device_unregister(pdev);
return ret;
}


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-25 Thread Luis R. Rodriguez
On Wed, Jun 25, 2014 at 2:51 PM, Luis R. Rodriguez mcg...@suse.com wrote:
 I'll go ahead and test this on the other
 distribution you mentioned you had issues, curious what could trigger a 
 timeout
 failure there that would be distribution specific.

I've tested this on SLE12 and see no issues as well.

  Luis
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-24 Thread Luis R. Rodriguez
On Wed, Jun 25, 2014 at 01:39:51AM +0200, Luis R. Rodriguez wrote:
> On Tue, Jun 24, 2014 at 09:34:19AM -0700, Casey Leedom wrote:
> > On 06/24/14 08:55, Casey Leedom wrote:
> >> On 06/23/14 17:29, Luis R. Rodriguez wrote:
> >   So I just did this for a normal modprobe (after the system is up):
> >
> > JiffiesProcess
> > ---
> >   0begin firmware load process
> >   3request_firmware() returns
> >   7start looking at the adapter
> >  10finish reading the first sector of existing adapter firmware
> >  26we've decided that we're going to upgrade the firmware
> >  28actual firmware upgrade process starts
> > 448we've finished halting the adapter processor
> > 451we enter the firmware write routine
> >   8,470we've finished erasing the firmware FLASH sectors
> >  14,336write of new firmware is complete
> >  14,340the new firmware load is complete
> >  14,949the adapter processor has been restarted; new firmware running
> >  14,952firmware upgrade process complete
> >
> > Maybe request_firmware() takes more time during the boot phase but as we 
> > can see from the above timings, it's the actual firmware upgrade process 
> > which takes the most time ...
> 
> OK so yeah the kernel work on request_firmware() isn't what takes over a
> minute, its the actual hardware poking with the firmware it gets, and then
> doing all the things you mentioned (a port for each netdevice, etc).  This is 
> a
> particularly interesting driver, apart from this I see some code about bus
> master and loading firmware only once. Can you elaborate a bit on how that is
> designed to work? Is it that only one PCI bus master device is allowed, and
> that will do the request_firmware() for all PCI devices? I'm a bit confused
> about this part, are we sure the bus master device will probe first? We can
> surely keep all this code on the driver but it seems that if all these
> complexitities might become the norm we should consider an API for sharing a
> clean framework for it.
> 
> As you noted the complexities on firmware loading, the number of different
> netdevices one device might actually have would make it impractical to try
> to do any completion on firmware on the ndo_init() with 
> request_firmware_nowait().
> Apart from a netdev specific API to handle all this cleanly, I wonder if
> drivers like these merit getting placed by default onto the 
> deferred_probe_active_list.
> Typically this is triggered when drivers don't have a resource a subsystem
> hasn't yet brought up, the driver returns -EPROBE_DEFER and the core driver
> infrastructure later probes these devices on a secondary list. Greg?

Actually another option to clean this up is to use 
platform_device_register_simple()
after the initial firmware load and start poking at stuff there. Check out
drivers/net/ethernet/8390/ne.c for an example with probe and all. I think
that can help split up the code paths quite nicely and let you do your
pre port thing there. Thoughts?

I still do have that question about bus master requirement though and ensuring
that there are no races.

  Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-24 Thread Luis R. Rodriguez
On Tue, Jun 24, 2014 at 09:34:19AM -0700, Casey Leedom wrote:
> On 06/24/14 08:55, Casey Leedom wrote:
>> On 06/23/14 17:29, Luis R. Rodriguez wrote:
>   So I just did this for a normal modprobe (after the system is up):
>
> JiffiesProcess
> ---
>   0begin firmware load process
>   3request_firmware() returns
>   7start looking at the adapter
>  10finish reading the first sector of existing adapter firmware
>  26we've decided that we're going to upgrade the firmware
>  28actual firmware upgrade process starts
> 448we've finished halting the adapter processor
> 451we enter the firmware write routine
>   8,470we've finished erasing the firmware FLASH sectors
>  14,336write of new firmware is complete
>  14,340the new firmware load is complete
>  14,949the adapter processor has been restarted; new firmware running
>  14,952firmware upgrade process complete
>
> Maybe request_firmware() takes more time during the boot phase but as we 
> can see from the above timings, it's the actual firmware upgrade process 
> which takes the most time ...

OK so yeah the kernel work on request_firmware() isn't what takes over a
minute, its the actual hardware poking with the firmware it gets, and then
doing all the things you mentioned (a port for each netdevice, etc).  This is a
particularly interesting driver, apart from this I see some code about bus
master and loading firmware only once. Can you elaborate a bit on how that is
designed to work? Is it that only one PCI bus master device is allowed, and
that will do the request_firmware() for all PCI devices? I'm a bit confused
about this part, are we sure the bus master device will probe first? We can
surely keep all this code on the driver but it seems that if all these
complexitities might become the norm we should consider an API for sharing a
clean framework for it.

As you noted the complexities on firmware loading, the number of different
netdevices one device might actually have would make it impractical to try
to do any completion on firmware on the ndo_init() with 
request_firmware_nowait().
Apart from a netdev specific API to handle all this cleanly, I wonder if
drivers like these merit getting placed by default onto the 
deferred_probe_active_list.
Typically this is triggered when drivers don't have a resource a subsystem
hasn't yet brought up, the driver returns -EPROBE_DEFER and the core driver
infrastructure later probes these devices on a secondary list. Greg?

  Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-24 Thread Casey Leedom


On 06/24/14 08:55, Casey Leedom wrote:


On 06/23/14 17:29, Luis R. Rodriguez wrote:

On Mon, Jun 23, 2014 at 12:06:48PM -0700, Casey Leedom wrote:


Also, it might be useful if there was a way for the driver
module to "tell" the timeout mechanism that forward progress _is_ being
made so it doesn't blow away the driver module load.

Indeed if this is actually needed, but believe the issue here for the
huge delays might be instead the lack of not using 
request_firmware_direct()
and actual device initialization time, which I do not believe we 
penalize,

we should be penalizing only the amount of time it takes either the
kernel or udev to read the firmware from the filesystem.


  If you want I can time the actual phases of loading new firmware: 
request_firmware(), writing it to FLASH, release_firmware() ...


  So I just did this for a normal modprobe (after the system is up):

JiffiesProcess
---
  0begin firmware load process
  3request_firmware() returns
  7start looking at the adapter
 10finish reading the first sector of existing adapter firmware
 26we've decided that we're going to upgrade the firmware
 28actual firmware upgrade process starts
448we've finished halting the adapter processor
451we enter the firmware write routine
  8,470we've finished erasing the firmware FLASH sectors
 14,336write of new firmware is complete
 14,340the new firmware load is complete
 14,949the adapter processor has been restarted; new firmware running
 14,952firmware upgrade process complete

Maybe request_firmware() takes more time during the boot phase but as we 
can see from the above timings, it's the actual firmware upgrade process 
which takes the most time ...


Casey
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-24 Thread Casey Leedom


On 06/23/14 17:29, Luis R. Rodriguez wrote:

On Mon, Jun 23, 2014 at 12:06:48PM -0700, Casey Leedom wrote:

   I've looked through the patch and I might be wrong, but it appears that
all the uses of the asynchronous request_firmware_nowait() are followed
immediately by wait_for_completion() calls which essentially would be the
same as the previous code with an added layer of mechanism.  Am I missing
something?

No you're right and I frailed to mention my original goal really is to
see if we can instead move that to ndo_init().


  Okay, thanks for confirming that.  I thought I was being very stupid.

  The problem I think with ndo_init() is that comes off a Network 
Device (struct net_device) and you can't have Network Devices till you 
talk to the adpater, discover how many ports you have, what their MAC 
Addresses are, etc.  And of course you'd then have to be prepared for an 
ndo_init() call on every instantiated Network Device on an adapter and 
only do the device initialization for the first (while holding off any 
and all activity on the others), etc.  All doable but a bit more 
complicated than doing this at Device Probe time.



   We do have a problem with initialization of multiple adapters with
external PHYs since, for each adapter we can check to see if the main
adapter firmware needs updating, and then load the PHY firmware.  If the
main firmware needs updating on more than one adapter, the combined time to
update each adapter's main firmware plus load the PHY firmware can exceed
some Distribution's default limits for a driver module's load time (since
the kernel seems to be processing the PCI Probe of each device
sequentially).

I noticed that for configuration updates it is optional for these configuration
updates to exist, in which case then if udev is enabled the driver will wait
quite a long time unncessarily. To fix that it seems request_firmware_direct()
would be better.


  Hhmmm, I'm unfamiliar with all of this.  I hadn't looked that far 
under the covers of request_firmware() to know that any of these 
variants existed, what their semantics were and when one over the other 
was the preferred API.



   It seems to me that it's unfortunate that the limit isn't on a per device
basis since a system could have an arbitrary number of devices managed by a
driver module.

The timeout is for the amount of time it takes the kernel to get the firemware,
not for device initialization, so its unclear to me that the 60 timeout thing
is actually causing an issue here.


  Are you sure about that?  I just loaded firmware on two of my 
T4-based adapters and each took about 15 seconds to complete.  The 
firmware is ~0.5MB and needs to be written to the on-adapter FLASH. The 
PHY firmware takes a bit less but not a lot.  Add that to the time to do 
general adapter initialization and you're cruising close to 1 minute for 
two adapters ...  Thus, my comment that whatever timeout is present 
should really be per-adapter based ... and it would be nice if the 
driver could inform the kernel as to the expected maximum device probe 
initialization time so we didn't have to have a huge inappropriate 
timeout for all devices ...



Also, it might be useful if there was a way for the driver
module to "tell" the timeout mechanism that forward progress _is_ being
made so it doesn't blow away the driver module load.

Indeed if this is actually needed, but believe the issue here for the
huge delays might be instead the lack of not using request_firmware_direct()
and actual device initialization time, which I do not believe we penalize,
we should be penalizing only the amount of time it takes either the
kernel or udev to read the firmware from the filesystem.


  If you want I can time the actual phases of loading new firmware: 
request_firmware(), writing it to FLASH, release_firmware() ...



  And maybe, if I'm
right regarding the sequential nature of the introduction of devices to
driver modules, it might make sense for a driver module to be able to
"tell" the kernel that it has no per-device dependencies and multiple
devices may be probed simultaneously ...

What if just configuration updates use request_firmware_direct() and
for the actual firmware which is required a request_firmware_nowait()
with a proper wait_for_completion() on the ndo_init() ?


  I'm not quite sure I understand what you're asking here.  The cxgb4 
driver attaches to the firmware in the probe() stage and, if the 
firmware is older then the supported version, upgrades the firmware and 
RESETs the device.  Then, for adapters with external PHYs (10Gb/s BT 
predominantly), the same process can happen for the PHY firmware (or on 
some adapters which have no PHY-attached FLASH, this happens for every 
driver load).  It's conceivable that we could defer the PHY firmware 
load till the first ndo_open() but we'd still be stuck with the 
seemingly broken idea that a simple timeout for a driver module load is 
good enough when what we seem to 

Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-24 Thread Casey Leedom


On 06/23/14 17:29, Luis R. Rodriguez wrote:

On Mon, Jun 23, 2014 at 12:06:48PM -0700, Casey Leedom wrote:

   I've looked through the patch and I might be wrong, but it appears that
all the uses of the asynchronous request_firmware_nowait() are followed
immediately by wait_for_completion() calls which essentially would be the
same as the previous code with an added layer of mechanism.  Am I missing
something?

No you're right and I frailed to mention my original goal really is to
see if we can instead move that to ndo_init().


  Okay, thanks for confirming that.  I thought I was being very stupid.

  The problem I think with ndo_init() is that comes off a Network 
Device (struct net_device) and you can't have Network Devices till you 
talk to the adpater, discover how many ports you have, what their MAC 
Addresses are, etc.  And of course you'd then have to be prepared for an 
ndo_init() call on every instantiated Network Device on an adapter and 
only do the device initialization for the first (while holding off any 
and all activity on the others), etc.  All doable but a bit more 
complicated than doing this at Device Probe time.



   We do have a problem with initialization of multiple adapters with
external PHYs since, for each adapter we can check to see if the main
adapter firmware needs updating, and then load the PHY firmware.  If the
main firmware needs updating on more than one adapter, the combined time to
update each adapter's main firmware plus load the PHY firmware can exceed
some Distribution's default limits for a driver module's load time (since
the kernel seems to be processing the PCI Probe of each device
sequentially).

I noticed that for configuration updates it is optional for these configuration
updates to exist, in which case then if udev is enabled the driver will wait
quite a long time unncessarily. To fix that it seems request_firmware_direct()
would be better.


  Hhmmm, I'm unfamiliar with all of this.  I hadn't looked that far 
under the covers of request_firmware() to know that any of these 
variants existed, what their semantics were and when one over the other 
was the preferred API.



   It seems to me that it's unfortunate that the limit isn't on a per device
basis since a system could have an arbitrary number of devices managed by a
driver module.

The timeout is for the amount of time it takes the kernel to get the firemware,
not for device initialization, so its unclear to me that the 60 timeout thing
is actually causing an issue here.


  Are you sure about that?  I just loaded firmware on two of my 
T4-based adapters and each took about 15 seconds to complete.  The 
firmware is ~0.5MB and needs to be written to the on-adapter FLASH. The 
PHY firmware takes a bit less but not a lot.  Add that to the time to do 
general adapter initialization and you're cruising close to 1 minute for 
two adapters ...  Thus, my comment that whatever timeout is present 
should really be per-adapter based ... and it would be nice if the 
driver could inform the kernel as to the expected maximum device probe 
initialization time so we didn't have to have a huge inappropriate 
timeout for all devices ...



Also, it might be useful if there was a way for the driver
module to tell the timeout mechanism that forward progress _is_ being
made so it doesn't blow away the driver module load.

Indeed if this is actually needed, but believe the issue here for the
huge delays might be instead the lack of not using request_firmware_direct()
and actual device initialization time, which I do not believe we penalize,
we should be penalizing only the amount of time it takes either the
kernel or udev to read the firmware from the filesystem.


  If you want I can time the actual phases of loading new firmware: 
request_firmware(), writing it to FLASH, release_firmware() ...



  And maybe, if I'm
right regarding the sequential nature of the introduction of devices to
driver modules, it might make sense for a driver module to be able to
tell the kernel that it has no per-device dependencies and multiple
devices may be probed simultaneously ...

What if just configuration updates use request_firmware_direct() and
for the actual firmware which is required a request_firmware_nowait()
with a proper wait_for_completion() on the ndo_init() ?


  I'm not quite sure I understand what you're asking here.  The cxgb4 
driver attaches to the firmware in the probe() stage and, if the 
firmware is older then the supported version, upgrades the firmware and 
RESETs the device.  Then, for adapters with external PHYs (10Gb/s BT 
predominantly), the same process can happen for the PHY firmware (or on 
some adapters which have no PHY-attached FLASH, this happens for every 
driver load).  It's conceivable that we could defer the PHY firmware 
load till the first ndo_open() but we'd still be stuck with the 
seemingly broken idea that a simple timeout for a driver module load is 
good enough when what we seem to need is 

Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-24 Thread Casey Leedom


On 06/24/14 08:55, Casey Leedom wrote:


On 06/23/14 17:29, Luis R. Rodriguez wrote:

On Mon, Jun 23, 2014 at 12:06:48PM -0700, Casey Leedom wrote:


Also, it might be useful if there was a way for the driver
module to tell the timeout mechanism that forward progress _is_ being
made so it doesn't blow away the driver module load.

Indeed if this is actually needed, but believe the issue here for the
huge delays might be instead the lack of not using 
request_firmware_direct()
and actual device initialization time, which I do not believe we 
penalize,

we should be penalizing only the amount of time it takes either the
kernel or udev to read the firmware from the filesystem.


  If you want I can time the actual phases of loading new firmware: 
request_firmware(), writing it to FLASH, release_firmware() ...


  So I just did this for a normal modprobe (after the system is up):

JiffiesProcess
---
  0begin firmware load process
  3request_firmware() returns
  7start looking at the adapter
 10finish reading the first sector of existing adapter firmware
 26we've decided that we're going to upgrade the firmware
 28actual firmware upgrade process starts
448we've finished halting the adapter processor
451we enter the firmware write routine
  8,470we've finished erasing the firmware FLASH sectors
 14,336write of new firmware is complete
 14,340the new firmware load is complete
 14,949the adapter processor has been restarted; new firmware running
 14,952firmware upgrade process complete

Maybe request_firmware() takes more time during the boot phase but as we 
can see from the above timings, it's the actual firmware upgrade process 
which takes the most time ...


Casey
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-24 Thread Luis R. Rodriguez
On Tue, Jun 24, 2014 at 09:34:19AM -0700, Casey Leedom wrote:
 On 06/24/14 08:55, Casey Leedom wrote:
 On 06/23/14 17:29, Luis R. Rodriguez wrote:
   So I just did this for a normal modprobe (after the system is up):

 JiffiesProcess
 ---
   0begin firmware load process
   3request_firmware() returns
   7start looking at the adapter
  10finish reading the first sector of existing adapter firmware
  26we've decided that we're going to upgrade the firmware
  28actual firmware upgrade process starts
 448we've finished halting the adapter processor
 451we enter the firmware write routine
   8,470we've finished erasing the firmware FLASH sectors
  14,336write of new firmware is complete
  14,340the new firmware load is complete
  14,949the adapter processor has been restarted; new firmware running
  14,952firmware upgrade process complete

 Maybe request_firmware() takes more time during the boot phase but as we 
 can see from the above timings, it's the actual firmware upgrade process 
 which takes the most time ...

OK so yeah the kernel work on request_firmware() isn't what takes over a
minute, its the actual hardware poking with the firmware it gets, and then
doing all the things you mentioned (a port for each netdevice, etc).  This is a
particularly interesting driver, apart from this I see some code about bus
master and loading firmware only once. Can you elaborate a bit on how that is
designed to work? Is it that only one PCI bus master device is allowed, and
that will do the request_firmware() for all PCI devices? I'm a bit confused
about this part, are we sure the bus master device will probe first? We can
surely keep all this code on the driver but it seems that if all these
complexitities might become the norm we should consider an API for sharing a
clean framework for it.

As you noted the complexities on firmware loading, the number of different
netdevices one device might actually have would make it impractical to try
to do any completion on firmware on the ndo_init() with 
request_firmware_nowait().
Apart from a netdev specific API to handle all this cleanly, I wonder if
drivers like these merit getting placed by default onto the 
deferred_probe_active_list.
Typically this is triggered when drivers don't have a resource a subsystem
hasn't yet brought up, the driver returns -EPROBE_DEFER and the core driver
infrastructure later probes these devices on a secondary list. Greg?

  Luis
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-24 Thread Luis R. Rodriguez
On Wed, Jun 25, 2014 at 01:39:51AM +0200, Luis R. Rodriguez wrote:
 On Tue, Jun 24, 2014 at 09:34:19AM -0700, Casey Leedom wrote:
  On 06/24/14 08:55, Casey Leedom wrote:
  On 06/23/14 17:29, Luis R. Rodriguez wrote:
So I just did this for a normal modprobe (after the system is up):
 
  JiffiesProcess
  ---
0begin firmware load process
3request_firmware() returns
7start looking at the adapter
   10finish reading the first sector of existing adapter firmware
   26we've decided that we're going to upgrade the firmware
   28actual firmware upgrade process starts
  448we've finished halting the adapter processor
  451we enter the firmware write routine
8,470we've finished erasing the firmware FLASH sectors
   14,336write of new firmware is complete
   14,340the new firmware load is complete
   14,949the adapter processor has been restarted; new firmware running
   14,952firmware upgrade process complete
 
  Maybe request_firmware() takes more time during the boot phase but as we 
  can see from the above timings, it's the actual firmware upgrade process 
  which takes the most time ...
 
 OK so yeah the kernel work on request_firmware() isn't what takes over a
 minute, its the actual hardware poking with the firmware it gets, and then
 doing all the things you mentioned (a port for each netdevice, etc).  This is 
 a
 particularly interesting driver, apart from this I see some code about bus
 master and loading firmware only once. Can you elaborate a bit on how that is
 designed to work? Is it that only one PCI bus master device is allowed, and
 that will do the request_firmware() for all PCI devices? I'm a bit confused
 about this part, are we sure the bus master device will probe first? We can
 surely keep all this code on the driver but it seems that if all these
 complexitities might become the norm we should consider an API for sharing a
 clean framework for it.
 
 As you noted the complexities on firmware loading, the number of different
 netdevices one device might actually have would make it impractical to try
 to do any completion on firmware on the ndo_init() with 
 request_firmware_nowait().
 Apart from a netdev specific API to handle all this cleanly, I wonder if
 drivers like these merit getting placed by default onto the 
 deferred_probe_active_list.
 Typically this is triggered when drivers don't have a resource a subsystem
 hasn't yet brought up, the driver returns -EPROBE_DEFER and the core driver
 infrastructure later probes these devices on a secondary list. Greg?

Actually another option to clean this up is to use 
platform_device_register_simple()
after the initial firmware load and start poking at stuff there. Check out
drivers/net/ethernet/8390/ne.c for an example with probe and all. I think
that can help split up the code paths quite nicely and let you do your
pre port thing there. Thoughts?

I still do have that question about bus master requirement though and ensuring
that there are no races.

  Luis
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-23 Thread Luis R. Rodriguez
On Mon, Jun 23, 2014 at 12:06:48PM -0700, Casey Leedom wrote:
>   I've looked through the patch and I might be wrong, but it appears that 
> all the uses of the asynchronous request_firmware_nowait() are followed 
> immediately by wait_for_completion() calls which essentially would be the 
> same as the previous code with an added layer of mechanism.  Am I missing 
> something?

No you're right and I frailed to mention my original goal really is to
see if we can instead move that to ndo_init().

>   We do have a problem with initialization of multiple adapters with 
> external PHYs since, for each adapter we can check to see if the main 
> adapter firmware needs updating, and then load the PHY firmware.  If the 
> main firmware needs updating on more than one adapter, the combined time to 
> update each adapter's main firmware plus load the PHY firmware can exceed 
> some Distribution's default limits for a driver module's load time (since 
> the kernel seems to be processing the PCI Probe of each device 
> sequentially).

I noticed that for configuration updates it is optional for these configuration
updates to exist, in which case then if udev is enabled the driver will wait
quite a long time unncessarily. To fix that it seems request_firmware_direct()
would be better.

>   It seems to me that it's unfortunate that the limit isn't on a per device 
> basis since a system could have an arbitrary number of devices managed by a 
> driver module. 

The timeout is for the amount of time it takes the kernel to get the firemware,
not for device initialization, so its unclear to me that the 60 timeout thing
is actually causing an issue here.

> Also, it might be useful if there was a way for the driver 
> module to "tell" the timeout mechanism that forward progress _is_ being 
> made so it doesn't blow away the driver module load.

Indeed if this is actually needed, but believe the issue here for the
huge delays might be instead the lack of not using request_firmware_direct()
and actual device initialization time, which I do not believe we penalize,
we should be penalizing only the amount of time it takes either the
kernel or udev to read the firmware from the filesystem.

>  And maybe, if I'm 
> right regarding the sequential nature of the introduction of devices to 
> driver modules, it might make sense for a driver module to be able to 
> "tell" the kernel that it has no per-device dependencies and multiple 
> devices may be probed simultaneously ...

What if just configuration updates use request_firmware_direct() and
for the actual firmware which is required a request_firmware_nowait()
with a proper wait_for_completion() on the ndo_init() ?

  Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-23 Thread Casey Leedom
  I've looked through the patch and I might be wrong, but it appears 
that all the uses of the asynchronous request_firmware_nowait() are 
followed immediately by wait_for_completion() calls which essentially 
would be the same as the previous code with an added layer of 
mechanism.  Am I missing something?


  We do have a problem with initialization of multiple adapters with 
external PHYs since, for each adapter we can check to see if the main 
adapter firmware needs updating, and then load the PHY firmware.  If the 
main firmware needs updating on more than one adapter, the combined time 
to update each adapter's main firmware plus load the PHY firmware can 
exceed some Distribution's default limits for a driver module's load 
time (since the kernel seems to be processing the PCI Probe of each 
device sequentially).


  It seems to me that it's unfortunate that the limit isn't on a per 
device basis since a system could have an arbitrary number of devices 
managed by a driver module.  Also, it might be useful if there was a way 
for the driver module to "tell" the timeout mechanism that forward 
progress _is_ being made so it doesn't blow away the driver module 
load.  And maybe, if I'm right regarding the sequential nature of the 
introduction of devices to driver modules, it might make sense for a 
driver module to be able to "tell" the kernel that it has no per-device 
dependencies and multiple devices may be probed simultaneously ...


Casey

On 06/20/14 17:39, Luis R. Rodriguez wrote:

From: "Luis R. Rodriguez" 

Its reported that loading the cxgb4 can take over 1 minute,
use the more sane request_firmware_nowait() API call just
in case this amount of time is causing issues. The driver
uses the firmware API 3 times, one for the firmware, one
for configuration and another one for flash, this provides
the port for all cases.

I don't have the hardware so please test. I did verify we
can use this during pci probe and also during the ethtool
flash callback.

Luis R. Rodriguez (3):
   cxgb4: make ethtool set_flash use request_firmware_nowait()
   cxgb4: make configuration load use request_firmware_nowait()
   cxgb4: make device firmware load use request_firmware_nowait()

  drivers/net/ethernet/chelsio/cxgb4/cxgb4.h  |  13 ++
  drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 258 +++-
  2 files changed, 176 insertions(+), 95 deletions(-)



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-23 Thread Casey Leedom
  I've looked through the patch and I might be wrong, but it appears 
that all the uses of the asynchronous request_firmware_nowait() are 
followed immediately by wait_for_completion() calls which essentially 
would be the same as the previous code with an added layer of 
mechanism.  Am I missing something?


  We do have a problem with initialization of multiple adapters with 
external PHYs since, for each adapter we can check to see if the main 
adapter firmware needs updating, and then load the PHY firmware.  If the 
main firmware needs updating on more than one adapter, the combined time 
to update each adapter's main firmware plus load the PHY firmware can 
exceed some Distribution's default limits for a driver module's load 
time (since the kernel seems to be processing the PCI Probe of each 
device sequentially).


  It seems to me that it's unfortunate that the limit isn't on a per 
device basis since a system could have an arbitrary number of devices 
managed by a driver module.  Also, it might be useful if there was a way 
for the driver module to tell the timeout mechanism that forward 
progress _is_ being made so it doesn't blow away the driver module 
load.  And maybe, if I'm right regarding the sequential nature of the 
introduction of devices to driver modules, it might make sense for a 
driver module to be able to tell the kernel that it has no per-device 
dependencies and multiple devices may be probed simultaneously ...


Casey

On 06/20/14 17:39, Luis R. Rodriguez wrote:

From: Luis R. Rodriguez mcg...@suse.com

Its reported that loading the cxgb4 can take over 1 minute,
use the more sane request_firmware_nowait() API call just
in case this amount of time is causing issues. The driver
uses the firmware API 3 times, one for the firmware, one
for configuration and another one for flash, this provides
the port for all cases.

I don't have the hardware so please test. I did verify we
can use this during pci probe and also during the ethtool
flash callback.

Luis R. Rodriguez (3):
   cxgb4: make ethtool set_flash use request_firmware_nowait()
   cxgb4: make configuration load use request_firmware_nowait()
   cxgb4: make device firmware load use request_firmware_nowait()

  drivers/net/ethernet/chelsio/cxgb4/cxgb4.h  |  13 ++
  drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 258 +++-
  2 files changed, 176 insertions(+), 95 deletions(-)



--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-23 Thread Luis R. Rodriguez
On Mon, Jun 23, 2014 at 12:06:48PM -0700, Casey Leedom wrote:
   I've looked through the patch and I might be wrong, but it appears that 
 all the uses of the asynchronous request_firmware_nowait() are followed 
 immediately by wait_for_completion() calls which essentially would be the 
 same as the previous code with an added layer of mechanism.  Am I missing 
 something?

No you're right and I frailed to mention my original goal really is to
see if we can instead move that to ndo_init().

   We do have a problem with initialization of multiple adapters with 
 external PHYs since, for each adapter we can check to see if the main 
 adapter firmware needs updating, and then load the PHY firmware.  If the 
 main firmware needs updating on more than one adapter, the combined time to 
 update each adapter's main firmware plus load the PHY firmware can exceed 
 some Distribution's default limits for a driver module's load time (since 
 the kernel seems to be processing the PCI Probe of each device 
 sequentially).

I noticed that for configuration updates it is optional for these configuration
updates to exist, in which case then if udev is enabled the driver will wait
quite a long time unncessarily. To fix that it seems request_firmware_direct()
would be better.

   It seems to me that it's unfortunate that the limit isn't on a per device 
 basis since a system could have an arbitrary number of devices managed by a 
 driver module. 

The timeout is for the amount of time it takes the kernel to get the firemware,
not for device initialization, so its unclear to me that the 60 timeout thing
is actually causing an issue here.

 Also, it might be useful if there was a way for the driver 
 module to tell the timeout mechanism that forward progress _is_ being 
 made so it doesn't blow away the driver module load.

Indeed if this is actually needed, but believe the issue here for the
huge delays might be instead the lack of not using request_firmware_direct()
and actual device initialization time, which I do not believe we penalize,
we should be penalizing only the amount of time it takes either the
kernel or udev to read the firmware from the filesystem.

  And maybe, if I'm 
 right regarding the sequential nature of the introduction of devices to 
 driver modules, it might make sense for a driver module to be able to 
 tell the kernel that it has no per-device dependencies and multiple 
 devices may be probed simultaneously ...

What if just configuration updates use request_firmware_direct() and
for the actual firmware which is required a request_firmware_nowait()
with a proper wait_for_completion() on the ndo_init() ?

  Luis
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-20 Thread Luis R. Rodriguez
From: "Luis R. Rodriguez" 

Its reported that loading the cxgb4 can take over 1 minute,
use the more sane request_firmware_nowait() API call just
in case this amount of time is causing issues. The driver
uses the firmware API 3 times, one for the firmware, one
for configuration and another one for flash, this provides
the port for all cases.

I don't have the hardware so please test. I did verify we
can use this during pci probe and also during the ethtool
flash callback.

Luis R. Rodriguez (3):
  cxgb4: make ethtool set_flash use request_firmware_nowait()
  cxgb4: make configuration load use request_firmware_nowait()
  cxgb4: make device firmware load use request_firmware_nowait()

 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h  |  13 ++
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 258 +++-
 2 files changed, 176 insertions(+), 95 deletions(-)

-- 
2.0.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFT 0/3] cxgb4: use request_firmware_nowait()

2014-06-20 Thread Luis R. Rodriguez
From: Luis R. Rodriguez mcg...@suse.com

Its reported that loading the cxgb4 can take over 1 minute,
use the more sane request_firmware_nowait() API call just
in case this amount of time is causing issues. The driver
uses the firmware API 3 times, one for the firmware, one
for configuration and another one for flash, this provides
the port for all cases.

I don't have the hardware so please test. I did verify we
can use this during pci probe and also during the ethtool
flash callback.

Luis R. Rodriguez (3):
  cxgb4: make ethtool set_flash use request_firmware_nowait()
  cxgb4: make configuration load use request_firmware_nowait()
  cxgb4: make device firmware load use request_firmware_nowait()

 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h  |  13 ++
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 258 +++-
 2 files changed, 176 insertions(+), 95 deletions(-)

-- 
2.0.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/