I have to revert the patch below from mmotm 2012-07-20-16-30 or
next-20120720 in order to boot on the PowerPC G5: otherwise it
freezes before switching to the framebuffer console - but I'm
not certain where because that initial console doesn't scroll
(there are mpic messages at bottom and at top of screen, probably
later messages at the top but I don't know the sequence).
Hugh
commit 94f036a1f242f98cc30700b7676c07270a9c5c27
Author: Grant Likely [off-list ref]
Date: Sun Jun 3 22:04:39 2012 -0700
irqdomain: eliminate slow-path revmap lookups
With the current state of irq_domain, the reverse map is always updated
when new IRQs get mapped. This means that the irq_find_mapping() function
can be simplified to execute the revmap lookup functions unconditionally
This patch adds lookup functions for the revmaps that don't yet have one
and removes the slow path lookup code path.
v8: Broke out unrelated changes into separate patches. Rebased on Paul's irq
association patches.
v7: Rebased to irqdomain/next for v3.4 and applied before the removal of 'hint'
v6: Remove the slow path entirely. The only place where the slow path
could get called is for a linear mapping if the hwirq number is larger
than the linear revmap size. There shouldn't be any interrupt
controllers that do that.
v5: rewrite to not use a ->revmap() callback. It is simpler, smaller,
safer and faster to open code each of the revmap lookups directly into
irq_find_mapping() via a switch statement.
v4: Fix build failure on incorrect variable reference.
Signed-off-by: Grant Likely <redacted>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Thomas Gleixner <redacted>
Cc: Milton Miller <redacted>
Cc: Paul Mundt <redacted>
Cc: Rob Herring <redacted>
@@ -686,16 +686,11 @@ EXPORT_SYMBOL_GPL(irq_dispose_mapping);*irq_find_mapping()-Findalinuxirqfromanhwirqnumber.*@domain:domainowningthishardwareinterrupt*@hwirq:hardwareirqnumberinthatdomainspace-*-*Thisisaslowpath,forusebygenericcode.It'sexpectedthatan-*irqcontrollerimplementationdirectlycallstheappropriatelowlevel-*mappingfunction.*/unsignedintirq_find_mapping(structirq_domain*domain,irq_hw_number_thwirq){-unsignedinti;-unsignedinthint=hwirq%nr_irqs;+structirq_data*data;/* Look for default domain if nececssary */if(domain==NULL)
@@ -703,22 +698,27 @@ unsigned int irq_find_mapping(struct irq_domain *domain,if(domain==NULL)return0;-/* legacy -> bail early */-if(domain->revmap_type==IRQ_DOMAIN_MAP_LEGACY)+switch(domain->revmap_type){+caseIRQ_DOMAIN_MAP_LEGACY:returnirq_domain_legacy_revmap(domain,hwirq);--/* Slow path does a linear search of the map */-if(hint==0)-hint=1;-i=hint;-do{-structirq_data*data=irq_get_irq_data(i);+caseIRQ_DOMAIN_MAP_LINEAR:+returnirq_linear_revmap(domain,hwirq);+caseIRQ_DOMAIN_MAP_TREE:+rcu_read_lock();+data=radix_tree_lookup(&domain->revmap_data.tree,hwirq);+rcu_read_unlock();+if(data)+returndata->irq;+break;+caseIRQ_DOMAIN_MAP_NOMAP:+data=irq_get_irq_data(hwirq);if(data&&(data->domain==domain)&&(data->hwirq==hwirq))-returni;-i++;-if(i>=nr_irqs)-i=1;-}while(i!=hint);+returnhwirq;+break;+}++WARN(1,"ERROR: irq revmap went horribly wrong. revmap_type=%i\n",+domain->revmap_type);return0;}EXPORT_SYMBOL_GPL(irq_find_mapping);
@@ -728,32 +728,19 @@ EXPORT_SYMBOL_GPL(irq_find_mapping);*@domain:domainowningthishardwareinterrupt*@hwirq:hardwareirqnumberinthatdomainspace*-*Thisisafastpath,forusebyirqcontrollercodethatuseslinear-*revmaps.Itdoesfallbacktotheslowpathiftherevmapdoesn'texist-*yetandwillcreatetherevmapentrywithappropriatelocking+*Thisisafastpaththatcanbecalleddirectlybyirqcontrollercodeto+*saveahandfulofinstructions.*/unsignedintirq_linear_revmap(structirq_domain*domain,irq_hw_number_thwirq){-unsignedint*revmap;+BUG_ON(domain->revmap_type!=IRQ_DOMAIN_MAP_LINEAR);-if(WARN_ON_ONCE(domain->revmap_type!=IRQ_DOMAIN_MAP_LINEAR))-returnirq_find_mapping(domain,hwirq);--/* Check revmap bounds */-if(unlikely(hwirq>=domain->revmap_data.linear.size))-returnirq_find_mapping(domain,hwirq);--/* Check if revmap was allocated */-revmap=domain->revmap_data.linear.revmap;-if(unlikely(revmap==NULL))-returnirq_find_mapping(domain,hwirq);--/* Fill up revmap with slow path if no mapping found */-if(unlikely(!revmap[hwirq]))-revmap[hwirq]=irq_find_mapping(domain,hwirq);+/* Check revmap bounds; complain if exceeded */+if(WARN_ON(hwirq>=domain->revmap_data.linear.size))+return0;-returnrevmap[hwirq];+returndomain->revmap_data.linear.revmap[hwirq];}EXPORT_SYMBOL_GPL(irq_linear_revmap);
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2012-07-22 13:09:58
On Sat, 2012-07-21 at 19:47 -0700, Hugh Dickins wrote:
I have to revert the patch below from mmotm 2012-07-20-16-30 or
next-20120720 in order to boot on the PowerPC G5: otherwise it
freezes before switching to the framebuffer console - but I'm
not certain where because that initial console doesn't scroll
(there are mpic messages at bottom and at top of screen, probably
later messages at the top but I don't know the sequence).
Remind me your G5 variant ? (/proc/cpuinfo will do). I'll have a look
tomorrow (and thanks for testing !).
Cheers,
Ben.
quoted hunk
Hugh
commit 94f036a1f242f98cc30700b7676c07270a9c5c27
Author: Grant Likely [off-list ref]
Date: Sun Jun 3 22:04:39 2012 -0700
irqdomain: eliminate slow-path revmap lookups
With the current state of irq_domain, the reverse map is always updated
when new IRQs get mapped. This means that the irq_find_mapping() function
can be simplified to execute the revmap lookup functions unconditionally
This patch adds lookup functions for the revmaps that don't yet have one
and removes the slow path lookup code path.
v8: Broke out unrelated changes into separate patches. Rebased on Paul's irq
association patches.
v7: Rebased to irqdomain/next for v3.4 and applied before the removal of 'hint'
v6: Remove the slow path entirely. The only place where the slow path
could get called is for a linear mapping if the hwirq number is larger
than the linear revmap size. There shouldn't be any interrupt
controllers that do that.
v5: rewrite to not use a ->revmap() callback. It is simpler, smaller,
safer and faster to open code each of the revmap lookups directly into
irq_find_mapping() via a switch statement.
v4: Fix build failure on incorrect variable reference.
Signed-off-by: Grant Likely <redacted>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Thomas Gleixner <redacted>
Cc: Milton Miller <redacted>
Cc: Paul Mundt <redacted>
Cc: Rob Herring <redacted>
@@ -686,16 +686,11 @@ EXPORT_SYMBOL_GPL(irq_dispose_mapping);*irq_find_mapping()-Findalinuxirqfromanhwirqnumber.*@domain:domainowningthishardwareinterrupt*@hwirq:hardwareirqnumberinthatdomainspace-*-*Thisisaslowpath,forusebygenericcode.It'sexpectedthatan-*irqcontrollerimplementationdirectlycallstheappropriatelowlevel-*mappingfunction.*/unsignedintirq_find_mapping(structirq_domain*domain,irq_hw_number_thwirq){-unsignedinti;-unsignedinthint=hwirq%nr_irqs;+structirq_data*data;/* Look for default domain if nececssary */if(domain==NULL)
@@ -703,22 +698,27 @@ unsigned int irq_find_mapping(struct irq_domain *domain,if(domain==NULL)return0;-/* legacy -> bail early */-if(domain->revmap_type==IRQ_DOMAIN_MAP_LEGACY)+switch(domain->revmap_type){+caseIRQ_DOMAIN_MAP_LEGACY:returnirq_domain_legacy_revmap(domain,hwirq);--/* Slow path does a linear search of the map */-if(hint==0)-hint=1;-i=hint;-do{-structirq_data*data=irq_get_irq_data(i);+caseIRQ_DOMAIN_MAP_LINEAR:+returnirq_linear_revmap(domain,hwirq);+caseIRQ_DOMAIN_MAP_TREE:+rcu_read_lock();+data=radix_tree_lookup(&domain->revmap_data.tree,hwirq);+rcu_read_unlock();+if(data)+returndata->irq;+break;+caseIRQ_DOMAIN_MAP_NOMAP:+data=irq_get_irq_data(hwirq);if(data&&(data->domain==domain)&&(data->hwirq==hwirq))-returni;-i++;-if(i>=nr_irqs)-i=1;-}while(i!=hint);+returnhwirq;+break;+}++WARN(1,"ERROR: irq revmap went horribly wrong. revmap_type=%i\n",+domain->revmap_type);return0;}EXPORT_SYMBOL_GPL(irq_find_mapping);
@@ -728,32 +728,19 @@ EXPORT_SYMBOL_GPL(irq_find_mapping);*@domain:domainowningthishardwareinterrupt*@hwirq:hardwareirqnumberinthatdomainspace*-*Thisisafastpath,forusebyirqcontrollercodethatuseslinear-*revmaps.Itdoesfallbacktotheslowpathiftherevmapdoesn'texist-*yetandwillcreatetherevmapentrywithappropriatelocking+*Thisisafastpaththatcanbecalleddirectlybyirqcontrollercodeto+*saveahandfulofinstructions.*/unsignedintirq_linear_revmap(structirq_domain*domain,irq_hw_number_thwirq){-unsignedint*revmap;+BUG_ON(domain->revmap_type!=IRQ_DOMAIN_MAP_LINEAR);-if(WARN_ON_ONCE(domain->revmap_type!=IRQ_DOMAIN_MAP_LINEAR))-returnirq_find_mapping(domain,hwirq);--/* Check revmap bounds */-if(unlikely(hwirq>=domain->revmap_data.linear.size))-returnirq_find_mapping(domain,hwirq);--/* Check if revmap was allocated */-revmap=domain->revmap_data.linear.revmap;-if(unlikely(revmap==NULL))-returnirq_find_mapping(domain,hwirq);--/* Fill up revmap with slow path if no mapping found */-if(unlikely(!revmap[hwirq]))-revmap[hwirq]=irq_find_mapping(domain,hwirq);+/* Check revmap bounds; complain if exceeded */+if(WARN_ON(hwirq>=domain->revmap_data.linear.size))+return0;-returnrevmap[hwirq];+returndomain->revmap_data.linear.revmap[hwirq];}EXPORT_SYMBOL_GPL(irq_linear_revmap);--
On Sun, 22 Jul 2012, Benjamin Herrenschmidt wrote:
On Sat, 2012-07-21 at 19:47 -0700, Hugh Dickins wrote:
quoted
I have to revert the patch below from mmotm 2012-07-20-16-30 or
next-20120720 in order to boot on the PowerPC G5: otherwise it
freezes before switching to the framebuffer console - but I'm
not certain where because that initial console doesn't scroll
(there are mpic messages at bottom and at top of screen, probably
later messages at the top but I don't know the sequence).
Remind me your G5 variant ? (/proc/cpuinfo will do). I'll have a look
tomorrow (and thanks for testing !).
quoted
commit 94f036a1f242f98cc30700b7676c07270a9c5c27
Author: Grant Likely [off-list ref]
Date: Sun Jun 3 22:04:39 2012 -0700
irqdomain: eliminate slow-path revmap lookups
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2012-07-23 02:46:16
On Sat, 2012-07-21 at 19:47 -0700, Hugh Dickins wrote:
I have to revert the patch below from mmotm 2012-07-20-16-30 or
next-20120720 in order to boot on the PowerPC G5: otherwise it
freezes before switching to the framebuffer console - but I'm
not certain where because that initial console doesn't scroll
(there are mpic messages at bottom and at top of screen, probably
later messages at the top but I don't know the sequence).
This fixes it (Grant, how do we avoid bisection breakage here ? I can
put that in -powerpc and we can make sure that gets merged before your
tree ?)
powerpc/mpic: Create a revmap with enough entries for IPIs and timers
The current mpic code creates a linear revmap just big enough for all
the sources, which happens to miss the IPIs and timers on some machines.
This will in turn break when the irqdomain code loses the fallback of
doing a linear search when the revmap fails (and really slows down IPIs
otherwise).
This happens for example on the U4 based Apple machines such as the
dual core PowerMac G5s.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2012-07-23 06:33:14
Allright, another one Grant:
unsigned int irq_find_mapping(struct irq_domain *domain,
irq_hw_number_t hwirq)
{
struct irq_data *data;
/* Look for default domain if nececssary */
if (domain == NULL)
domain = irq_default_domain;
if (domain == NULL)
return 0;
switch (domain->revmap_type) {
case IRQ_DOMAIN_MAP_LEGACY:
return irq_domain_legacy_revmap(domain, hwirq);
case IRQ_DOMAIN_MAP_LINEAR:
return irq_linear_revmap(domain, hwirq);
case IRQ_DOMAIN_MAP_TREE:
rcu_read_lock();
data = radix_tree_lookup(&domain->revmap_data.tree, hwirq);
rcu_read_unlock();
if (data)
return data->irq;
- break;
+ return 0;
case IRQ_DOMAIN_MAP_NOMAP:
Please, stick a proper commit message and my s-o-b and see if you can fix
your tree before you ask Linus to pull because that's not pretty on any
pseries .... irq_find_mapping() does get called for all interrupt the
first time it's mapped to check if there's a pre-existing mapping, so
the case of the thing being unpopulated is absolutely legit.
the NOMAP case has a similar dubious exit case but since I'm not that
familiar with NOMAP I haven't touched it.
Cheers,
Ben.
On Mon, 23 Jul 2012, Benjamin Herrenschmidt wrote:
On Sat, 2012-07-21 at 19:47 -0700, Hugh Dickins wrote:
quoted
I have to revert the patch below from mmotm 2012-07-20-16-30 or
next-20120720 in order to boot on the PowerPC G5: otherwise it
freezes before switching to the framebuffer console - but I'm
not certain where because that initial console doesn't scroll
(there are mpic messages at bottom and at top of screen, probably
later messages at the top but I don't know the sequence).
This fixes it
Confirmed: many thanks, Ben.
quoted hunk
(Grant, how do we avoid bisection breakage here ? I can
put that in -powerpc and we can make sure that gets merged before your
tree ?)
powerpc/mpic: Create a revmap with enough entries for IPIs and timers
The current mpic code creates a linear revmap just big enough for all
the sources, which happens to miss the IPIs and timers on some machines.
This will in turn break when the irqdomain code loses the fallback of
doing a linear search when the revmap fails (and really slows down IPIs
otherwise).
This happens for example on the U4 based Apple machines such as the
dual core PowerMac G5s.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
From: Grant Likely <hidden> Date: 2012-07-23 07:59:32
On Sun, Jul 22, 2012 at 8:45 PM, Benjamin Herrenschmidt
[off-list ref] wrote:
On Sat, 2012-07-21 at 19:47 -0700, Hugh Dickins wrote:
quoted
I have to revert the patch below from mmotm 2012-07-20-16-30 or
next-20120720 in order to boot on the PowerPC G5: otherwise it
freezes before switching to the framebuffer console - but I'm
not certain where because that initial console doesn't scroll
(there are mpic messages at bottom and at top of screen, probably
later messages at the top but I don't know the sequence).
This fixes it (Grant, how do we avoid bisection breakage here ? I can
put that in -powerpc and we can make sure that gets merged before your
tree ?)
My tree must be rebased to eliminate bisect breakage. The existing
commits in my tree have the breakage, and fiddling with the merge
order doesn't affect that. I don't want to rebase though. The safest
approach (smallest window of breakage) is to apply that fix onto my
irqdomain tree.
g.
quoted hunk
powerpc/mpic: Create a revmap with enough entries for IPIs and timers
The current mpic code creates a linear revmap just big enough for all
the sources, which happens to miss the IPIs and timers on some machines.
This will in turn break when the irqdomain code loses the fallback of
doing a linear search when the revmap fails (and really slows down IPIs
otherwise).
This happens for example on the U4 based Apple machines such as the
dual core PowerMac G5s.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2012-07-23 22:26:49
On Mon, 2012-07-23 at 01:59 -0600, Grant Likely wrote:
My tree must be rebased to eliminate bisect breakage. The existing
commits in my tree have the breakage, and fiddling with the merge
order doesn't affect that. I don't want to rebase though. The safest
approach (smallest window of breakage) is to apply that fix onto my
irqdomain tree.
With your other breakage on pseries I'm thinking rebasing might be the
only option...
Cheers,
Ben.
From: Grant Likely <hidden> Date: 2012-07-23 22:31:22
On Mon, Jul 23, 2012 at 4:26 PM, Benjamin Herrenschmidt
[off-list ref] wrote:
On Mon, 2012-07-23 at 01:59 -0600, Grant Likely wrote:
quoted
My tree must be rebased to eliminate bisect breakage. The existing
commits in my tree have the breakage, and fiddling with the merge
order doesn't affect that. I don't want to rebase though. The safest
approach (smallest window of breakage) is to apply that fix onto my
irqdomain tree.
With your other breakage on pseries I'm thinking rebasing might be the
only option...
Fair enough. I'm not planning to ask Linus to pull for a few days yet
anyway. I've been pretty useless as a kernel maintainer for the last 3
months so I want to give a bit more time in linux-next to catch
fallout before it gets merged.
As-is I'm backing off from the linear/legacy/tree merge patch as just
too risky. I've already pulled that stuff out of linux-next.
g.
From: Grant Likely <hidden> Date: 2012-07-23 22:32:54
On Mon, Jul 23, 2012 at 4:31 PM, Grant Likely [off-list ref] wrote:
On Mon, Jul 23, 2012 at 4:26 PM, Benjamin Herrenschmidt
[off-list ref] wrote:
quoted
On Mon, 2012-07-23 at 01:59 -0600, Grant Likely wrote:
quoted
My tree must be rebased to eliminate bisect breakage. The existing
commits in my tree have the breakage, and fiddling with the merge
order doesn't affect that. I don't want to rebase though. The safest
approach (smallest window of breakage) is to apply that fix onto my
irqdomain tree.
With your other breakage on pseries I'm thinking rebasing might be the
only option...
Fair enough. I'm not planning to ask Linus to pull for a few days yet
anyway. I've been pretty useless as a kernel maintainer for the last 3
months so I want to give a bit more time in linux-next to catch
fallout before it gets merged.
As-is I'm backing off from the linear/legacy/tree merge patch as just
too risky. I've already pulled that stuff out of linux-next.
Can I pull you pseries fix into my tree (my preference), or do I need
to rebase on top of yours?
g.
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2012-07-24 03:22:21
On Mon, 2012-07-23 at 16:32 -0600, Grant Likely wrote:
quoted
As-is I'm backing off from the linear/legacy/tree merge patch as just
too risky. I've already pulled that stuff out of linux-next.
Can I pull you pseries fix into my tree (my preference), or do I need
to rebase on top of yours?
The mpic fix for the g5 is in Linus tree already, I added it on top of
powerpc -next before I asked Linus to pull.
For pseries (ie the fix for irq_find_mapping vs. radix), I don't have a
formal patch, just the one I hand typed in my previous email, so do
whatever you want with it.
Cheers,
Ben.
From: Grant Likely <hidden> Date: 2012-07-24 04:37:58
On Mon, Jul 23, 2012 at 9:21 PM, Benjamin Herrenschmidt
[off-list ref] wrote:
On Mon, 2012-07-23 at 16:32 -0600, Grant Likely wrote:
quoted
quoted
As-is I'm backing off from the linear/legacy/tree merge patch as just
too risky. I've already pulled that stuff out of linux-next.
Can I pull you pseries fix into my tree (my preference), or do I need
to rebase on top of yours?
The mpic fix for the g5 is in Linus tree already, I added it on top of
powerpc -next before I asked Linus to pull.
For pseries (ie the fix for irq_find_mapping vs. radix), I don't have a
formal patch, just the one I hand typed in my previous email, so do
whatever you want with it.
Okay, I'll merge in Linus' tree at the appropriate point to protect
against bisection, and I'll fix up the appropriate patch that touches
irq_find_mapping.
g.
From: Grant Likely <hidden> Date: 2012-07-25 05:09:34
On Mon, Jul 23, 2012 at 12:32 AM, Benjamin Herrenschmidt
[off-list ref] wrote:
Allright, another one Grant:
unsigned int irq_find_mapping(struct irq_domain *domain,
irq_hw_number_t hwirq)
{
struct irq_data *data;
/* Look for default domain if nececssary */
if (domain == NULL)
domain = irq_default_domain;
if (domain == NULL)
return 0;
switch (domain->revmap_type) {
case IRQ_DOMAIN_MAP_LEGACY:
return irq_domain_legacy_revmap(domain, hwirq);
case IRQ_DOMAIN_MAP_LINEAR:
return irq_linear_revmap(domain, hwirq);
case IRQ_DOMAIN_MAP_TREE:
rcu_read_lock();
data = radix_tree_lookup(&domain->revmap_data.tree, hwirq);
rcu_read_unlock();
if (data)
return data->irq;
- break;
+ return 0;
case IRQ_DOMAIN_MAP_NOMAP:
Please, stick a proper commit message and my s-o-b and see if you can fix
your tree before you ask Linus to pull because that's not pretty on any
pseries .... irq_find_mapping() does get called for all interrupt the
first time it's mapped to check if there's a pre-existing mapping, so
the case of the thing being unpopulated is absolutely legit.
the NOMAP case has a similar dubious exit case but since I'm not that
familiar with NOMAP I haven't touched it.
I've decided to rework the patch to simply omit the WARN statement. It
isn't really needed. I've merged in Linus' tree below the eliminate
slow-path patch and remove the WARN statement. It's been pushed out to
my irqdomain/next branch, so it should show up in tomorrow's
linux-next.
You can find it here if you want to give it a spin:
git://git.secretlab.ca/git/linux-2.6 irqdomain/next
I'll give it a bit more time in linux-next before I ask Linus to pull.
g.