[PATCH 2/2] kernel: irq: rename irq_set_default_host to irq_domain_set_default()

From: Linus Walleij
Date: Thu Feb 12 2015 - 18:56:59 EST


This function does not conform to the irq_domain* namespace and
makes it a disturbing artifact dating back to a time when irq
domains were referred to as "hosts". Rename it.

Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx>
---
arch/arc/kernel/irq.c | 2 +-
arch/arm/mach-pxa/irq.c | 2 +-
arch/c6x/kernel/irq.c | 2 +-
arch/microblaze/kernel/intc.c | 2 +-
arch/mips/cavium-octeon/octeon-irq.c | 4 ++--
arch/nios2/kernel/irq.c | 2 +-
arch/powerpc/platforms/52xx/mpc52xx_pic.c | 2 +-
arch/powerpc/platforms/amigaone/setup.c | 2 +-
arch/powerpc/platforms/cell/beat_interrupt.c | 2 +-
arch/powerpc/platforms/cell/interrupt.c | 2 +-
arch/powerpc/platforms/chrp/setup.c | 2 +-
arch/powerpc/platforms/embedded6xx/flipper-pic.c | 2 +-
arch/powerpc/platforms/powermac/pic.c | 2 +-
arch/powerpc/platforms/ps3/interrupt.c | 2 +-
arch/powerpc/sysdev/ehv_pic.c | 2 +-
arch/powerpc/sysdev/ipic.c | 2 +-
arch/powerpc/sysdev/mpic.c | 2 +-
arch/powerpc/sysdev/uic.c | 2 +-
arch/powerpc/sysdev/xics/xics-common.c | 2 +-
arch/powerpc/sysdev/xilinx_intc.c | 2 +-
arch/x86/kernel/apic/io_apic.c | 2 +-
drivers/irqchip/irq-armada-370-xp.c | 2 +-
drivers/irqchip/irq-clps711x.c | 2 +-
drivers/irqchip/irq-mmp.c | 8 ++++----
drivers/irqchip/irq-xtensa-mx.c | 4 ++--
drivers/irqchip/irq-xtensa-pic.c | 4 ++--
include/linux/irqdomain.h | 2 +-
kernel/irq/irqdomain.c | 10 +++++-----
28 files changed, 38 insertions(+), 38 deletions(-)

diff --git a/arch/arc/kernel/irq.c b/arch/arc/kernel/irq.c
index 620ec2fe32a9..e98f25c9b0cf 100644
--- a/arch/arc/kernel/irq.c
+++ b/arch/arc/kernel/irq.c
@@ -110,7 +110,7 @@ init_onchip_IRQ(struct device_node *intc, struct device_node *parent)
panic("root irq domain not avail\n");

/* with this we don't need to export root_domain */
- irq_set_default_host(root_domain);
+ irq_domain_set_default(root_domain);

return 0;
}
diff --git a/arch/arm/mach-pxa/irq.c b/arch/arm/mach-pxa/irq.c
index 0eecd83c624e..dea4c4db3abb 100644
--- a/arch/arm/mach-pxa/irq.c
+++ b/arch/arm/mach-pxa/irq.c
@@ -272,7 +272,7 @@ void __init pxa_dt_irq_init(int (*fn)(struct irq_data *, unsigned int))
if (!pxa_irq_domain)
panic("Unable to add PXA IRQ domain\n");

- irq_set_default_host(pxa_irq_domain);
+ irq_domain_set_default(pxa_irq_domain);

for (n = 0; n < pxa_internal_irq_nr; n += 32) {
void __iomem *base = irq_base(n >> 5);
diff --git a/arch/c6x/kernel/irq.c b/arch/c6x/kernel/irq.c
index 247e0eb5e467..92d6de47964b 100644
--- a/arch/c6x/kernel/irq.c
+++ b/arch/c6x/kernel/irq.c
@@ -105,7 +105,7 @@ void __init init_IRQ(void)
core_domain = irq_domain_add_linear(np, NR_PRIORITY_IRQS,
&core_domain_ops, NULL);
if (core_domain)
- irq_set_default_host(core_domain);
+ irq_domain_set_default(core_domain);
of_node_put(np);
}

diff --git a/arch/microblaze/kernel/intc.c b/arch/microblaze/kernel/intc.c
index 719feee1e043..4ed819828f44 100644
--- a/arch/microblaze/kernel/intc.c
+++ b/arch/microblaze/kernel/intc.c
@@ -189,7 +189,7 @@ static int __init xilinx_intc_of_init(struct device_node *intc,
root_domain = irq_domain_add_linear(intc, nr_irq, &xintc_irq_domain_ops,
(void *)intr_mask);

- irq_set_default_host(root_domain);
+ irq_domain_set_default(root_domain);

return 0;
}
diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c
index 2bc4aa95944e..e739ec21ed0f 100644
--- a/arch/mips/cavium-octeon/octeon-irq.c
+++ b/arch/mips/cavium-octeon/octeon-irq.c
@@ -1245,7 +1245,7 @@ static void __init octeon_irq_init_ciu(void)
ciu_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-ciu");
if (ciu_node) {
ciu_domain = irq_domain_add_tree(ciu_node, &octeon_irq_domain_ciu_ops, NULL);
- irq_set_default_host(ciu_domain);
+ irq_domain_set_default(ciu_domain);
of_node_put(ciu_node);
} else
panic("Cannot find device node for cavium,octeon-3860-ciu.");
@@ -1709,7 +1709,7 @@ static void __init octeon_irq_init_ciu2(void)
ciu_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-6880-ciu2");
if (ciu_node) {
ciu_domain = irq_domain_add_tree(ciu_node, &octeon_irq_domain_ciu2_ops, NULL);
- irq_set_default_host(ciu_domain);
+ irq_domain_set_default(ciu_domain);
of_node_put(ciu_node);
} else
panic("Cannot find device node for cavium,octeon-6880-ciu2.");
diff --git a/arch/nios2/kernel/irq.c b/arch/nios2/kernel/irq.c
index f5b74ae69b5b..6054837e1b12 100644
--- a/arch/nios2/kernel/irq.c
+++ b/arch/nios2/kernel/irq.c
@@ -86,7 +86,7 @@ void __init init_IRQ(void)
domain = irq_domain_add_linear(node, NIOS2_CPU_NR_IRQS, &irq_ops, NULL);
BUG_ON(!domain);

- irq_set_default_host(domain);
+ irq_domain_set_default(domain);
of_node_put(node);
/* Load the initial ienable value */
ienable = RDCTL(CTL_IENABLE);
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_pic.c b/arch/powerpc/platforms/52xx/mpc52xx_pic.c
index 2944bc84b9d6..2b82c88082e8 100644
--- a/arch/powerpc/platforms/52xx/mpc52xx_pic.c
+++ b/arch/powerpc/platforms/52xx/mpc52xx_pic.c
@@ -452,7 +452,7 @@ void __init mpc52xx_init_irq(void)
if (!mpc52xx_irqhost)
panic(__FILE__ ": Cannot allocate the IRQ host\n");

- irq_set_default_host(mpc52xx_irqhost);
+ irq_domain_set_default(mpc52xx_irqhost);

pr_info("MPC52xx PIC is up and running!\n");
}
diff --git a/arch/powerpc/platforms/amigaone/setup.c b/arch/powerpc/platforms/amigaone/setup.c
index 2fe12046279e..b29723aee874 100644
--- a/arch/powerpc/platforms/amigaone/setup.c
+++ b/arch/powerpc/platforms/amigaone/setup.c
@@ -109,7 +109,7 @@ void __init amigaone_init_IRQ(void)

i8259_init(pic, int_ack);
ppc_md.get_irq = i8259_irq;
- irq_set_default_host(i8259_get_host());
+ irq_domain_set_default(i8259_get_host());
}

static int __init request_isa_regions(void)
diff --git a/arch/powerpc/platforms/cell/beat_interrupt.c b/arch/powerpc/platforms/cell/beat_interrupt.c
index 9e5dfbcc00af..cf57962cebd9 100644
--- a/arch/powerpc/platforms/cell/beat_interrupt.c
+++ b/arch/powerpc/platforms/cell/beat_interrupt.c
@@ -241,7 +241,7 @@ void __init beatic_init_IRQ(void)
/* Allocate an irq host */
beatic_host = irq_domain_add_nomap(NULL, ~0, &beatic_pic_host_ops, NULL);
BUG_ON(beatic_host == NULL);
- irq_set_default_host(beatic_host);
+ irq_domain_set_default(beatic_host);
}

void beatic_deinit_IRQ(void)
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c
index 4c11421847be..089f770f6485 100644
--- a/arch/powerpc/platforms/cell/interrupt.c
+++ b/arch/powerpc/platforms/cell/interrupt.c
@@ -381,7 +381,7 @@ void __init iic_init_IRQ(void)
iic_host = irq_domain_add_linear(NULL, IIC_SOURCE_COUNT, &iic_host_ops,
NULL);
BUG_ON(iic_host == NULL);
- irq_set_default_host(iic_host);
+ irq_domain_set_default(iic_host);

/* Discover and initialize iics */
if (setup_iic() < 0)
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c
index 860a59eb8ea2..28d1c48eabcb 100644
--- a/arch/powerpc/platforms/chrp/setup.c
+++ b/arch/powerpc/platforms/chrp/setup.c
@@ -510,7 +510,7 @@ static void __init chrp_find_8259(void)
i8259_init(pic, chrp_int_ack);
if (ppc_md.get_irq == NULL) {
ppc_md.get_irq = i8259_irq;
- irq_set_default_host(i8259_get_host());
+ irq_domain_set_default(i8259_get_host());
}
if (chrp_mpic != NULL) {
cascade_irq = irq_of_parse_and_map(pic, 0);
diff --git a/arch/powerpc/platforms/embedded6xx/flipper-pic.c b/arch/powerpc/platforms/embedded6xx/flipper-pic.c
index 4cde8e7da4b8..0d13266b2c5b 100644
--- a/arch/powerpc/platforms/embedded6xx/flipper-pic.c
+++ b/arch/powerpc/platforms/embedded6xx/flipper-pic.c
@@ -201,7 +201,7 @@ void __init flipper_pic_probe(void)
flipper_irq_host = flipper_pic_init(np);
BUG_ON(!flipper_irq_host);

- irq_set_default_host(flipper_irq_host);
+ irq_domain_set_default(flipper_irq_host);

of_node_put(np);
}
diff --git a/arch/powerpc/platforms/powermac/pic.c b/arch/powerpc/platforms/powermac/pic.c
index 4c24bf60d39d..341afdbe3ad7 100644
--- a/arch/powerpc/platforms/powermac/pic.c
+++ b/arch/powerpc/platforms/powermac/pic.c
@@ -344,7 +344,7 @@ static void __init pmac_pic_probe_oldstyle(void)
pmac_pic_host = irq_domain_add_linear(master, max_irqs,
&pmac_pic_host_ops, NULL);
BUG_ON(pmac_pic_host == NULL);
- irq_set_default_host(pmac_pic_host);
+ irq_domain_set_default(pmac_pic_host);

/* Get addresses of first controller if we have a node for it */
BUG_ON(of_address_to_resource(master, 0, &r));
diff --git a/arch/powerpc/platforms/ps3/interrupt.c b/arch/powerpc/platforms/ps3/interrupt.c
index a6c42f34303a..2a9149a34701 100644
--- a/arch/powerpc/platforms/ps3/interrupt.c
+++ b/arch/powerpc/platforms/ps3/interrupt.c
@@ -754,7 +754,7 @@ void __init ps3_init_IRQ(void)
struct irq_domain *host;

host = irq_domain_add_nomap(NULL, PS3_PLUG_MAX + 1, &ps3_host_ops, NULL);
- irq_set_default_host(host);
+ irq_domain_set_default(host);

for_each_possible_cpu(cpu) {
struct ps3_private *pd = &per_cpu(ps3_private, cpu);
diff --git a/arch/powerpc/sysdev/ehv_pic.c b/arch/powerpc/sysdev/ehv_pic.c
index 2d20f10a4203..3e3d58298c6c 100644
--- a/arch/powerpc/sysdev/ehv_pic.c
+++ b/arch/powerpc/sysdev/ehv_pic.c
@@ -292,5 +292,5 @@ void __init ehv_pic_init(void)
ehv_pic->coreint_flag = coreint_flag;

global_ehv_pic = ehv_pic;
- irq_set_default_host(global_ehv_pic->irqhost);
+ irq_domain_set_default(global_ehv_pic->irqhost);
}
diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c
index b28733727ed3..4dcf19d14f25 100644
--- a/arch/powerpc/sysdev/ipic.c
+++ b/arch/powerpc/sysdev/ipic.c
@@ -757,7 +757,7 @@ struct ipic * __init ipic_init(struct device_node *node, unsigned int flags)
ipic_write(ipic->regs, IPIC_SEMSR, temp);

primary_ipic = ipic;
- irq_set_default_host(primary_ipic->irqhost);
+ irq_domain_set_default(primary_ipic->irqhost);

ipic_write(ipic->regs, IPIC_SIMSR_H, 0);
ipic_write(ipic->regs, IPIC_SIMSR_L, 0);
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
index c4648ad5c1f3..5e08fe518449 100644
--- a/arch/powerpc/sysdev/mpic.c
+++ b/arch/powerpc/sysdev/mpic.c
@@ -1537,7 +1537,7 @@ struct mpic * __init mpic_alloc(struct device_node *node,

if (!(mpic->flags & MPIC_SECONDARY)) {
mpic_primary = mpic;
- irq_set_default_host(mpic->irqhost);
+ irq_domain_set_default(mpic->irqhost);
}

return mpic;
diff --git a/arch/powerpc/sysdev/uic.c b/arch/powerpc/sysdev/uic.c
index 7c37157d4c24..e9d955e9c897 100644
--- a/arch/powerpc/sysdev/uic.c
+++ b/arch/powerpc/sysdev/uic.c
@@ -294,7 +294,7 @@ void __init uic_init_tree(void)
if (!primary_uic)
panic("Unable to initialize primary UIC %s\n", np->full_name);

- irq_set_default_host(primary_uic->irqhost);
+ irq_domain_set_default(primary_uic->irqhost);
of_node_put(np);

/* The scan again for cascaded UICs */
diff --git a/arch/powerpc/sysdev/xics/xics-common.c b/arch/powerpc/sysdev/xics/xics-common.c
index 365249cd346b..2c9c7e7c52d7 100644
--- a/arch/powerpc/sysdev/xics/xics-common.c
+++ b/arch/powerpc/sysdev/xics/xics-common.c
@@ -372,7 +372,7 @@ static void __init xics_init_host(void)
{
xics_host = irq_domain_add_tree(NULL, &xics_host_ops, NULL);
BUG_ON(xics_host == NULL);
- irq_set_default_host(xics_host);
+ irq_domain_set_default(xics_host);
}

void __init xics_register_ics(struct ics *ics)
diff --git a/arch/powerpc/sysdev/xilinx_intc.c b/arch/powerpc/sysdev/xilinx_intc.c
index 56f0524e47a6..7604a0c6bde8 100644
--- a/arch/powerpc/sysdev/xilinx_intc.c
+++ b/arch/powerpc/sysdev/xilinx_intc.c
@@ -288,7 +288,7 @@ void __init xilinx_intc_init_tree(void)
master_irqhost = xilinx_intc_init(np);
BUG_ON(!master_irqhost);

- irq_set_default_host(master_irqhost);
+ irq_domain_set_default(master_irqhost);
of_node_put(np);

xilinx_i8259_setup_cascade();
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index f4dc2462a1ac..573190540a73 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -2357,7 +2357,7 @@ static int mp_irqdomain_create(int ioapic)
gsi_cfg->gsi_end + 1);

if (gsi_cfg->gsi_base == 0)
- irq_set_default_host(ip->irqdomain);
+ irq_domain_set_default(ip->irqdomain);

return 0;
}
diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c
index 463c235acbdc..8b11981c6998 100644
--- a/drivers/irqchip/irq-armada-370-xp.c
+++ b/drivers/irqchip/irq-armada-370-xp.c
@@ -580,7 +580,7 @@ static int __init armada_370_xp_mpic_of_init(struct device_node *node,

parent_irq = irq_of_parse_and_map(node, 0);
if (parent_irq <= 0) {
- irq_set_default_host(armada_370_xp_mpic_domain);
+ irq_domain_set_default(armada_370_xp_mpic_domain);
set_handle_irq(armada_370_xp_handle_irq);
#ifdef CONFIG_SMP
set_smp_cross_call(armada_mpic_send_doorbell);
diff --git a/drivers/irqchip/irq-clps711x.c b/drivers/irqchip/irq-clps711x.c
index 33127f131d78..3b3242b21e82 100644
--- a/drivers/irqchip/irq-clps711x.c
+++ b/drivers/irqchip/irq-clps711x.c
@@ -196,7 +196,7 @@ static int __init _clps711x_intc_init(struct device_node *np,
goto out_irqfree;
}

- irq_set_default_host(clps711x_intc->domain);
+ irq_domain_set_default(clps711x_intc->domain);
set_handle_irq(clps711x_irqh);

#ifdef CONFIG_FIQ
diff --git a/drivers/irqchip/irq-mmp.c b/drivers/irqchip/irq-mmp.c
index c0da57bdb89d..178f69d4c67d 100644
--- a/drivers/irqchip/irq-mmp.c
+++ b/drivers/irqchip/irq-mmp.c
@@ -236,7 +236,7 @@ void __init icu_init_irq(void)
irq_set_chip_and_handler(irq, &icu_irq_chip, handle_level_irq);
set_irq_flags(irq, IRQF_VALID);
}
- irq_set_default_host(icu_data[0].domain);
+ irq_domain_set_default(icu_data[0].domain);
set_handle_irq(mmp_handle_irq);
}

@@ -339,7 +339,7 @@ void __init mmp2_init_icu(void)
}
set_irq_flags(irq, IRQF_VALID);
}
- irq_set_default_host(icu_data[0].domain);
+ irq_domain_set_default(icu_data[0].domain);
set_handle_irq(mmp2_handle_irq);
}

@@ -397,7 +397,7 @@ static int __init mmp_of_init(struct device_node *node,
icu_data[0].conf_enable = mmp_conf.conf_enable;
icu_data[0].conf_disable = mmp_conf.conf_disable;
icu_data[0].conf_mask = mmp_conf.conf_mask;
- irq_set_default_host(icu_data[0].domain);
+ irq_domain_set_default(icu_data[0].domain);
set_handle_irq(mmp_handle_irq);
max_icu_nr = 1;
return 0;
@@ -416,7 +416,7 @@ static int __init mmp2_of_init(struct device_node *node,
icu_data[0].conf_enable = mmp2_conf.conf_enable;
icu_data[0].conf_disable = mmp2_conf.conf_disable;
icu_data[0].conf_mask = mmp2_conf.conf_mask;
- irq_set_default_host(icu_data[0].domain);
+ irq_domain_set_default(icu_data[0].domain);
set_handle_irq(mmp2_handle_irq);
max_icu_nr = 1;
return 0;
diff --git a/drivers/irqchip/irq-xtensa-mx.c b/drivers/irqchip/irq-xtensa-mx.c
index e1c2f9632893..3d898ae1b44e 100644
--- a/drivers/irqchip/irq-xtensa-mx.c
+++ b/drivers/irqchip/irq-xtensa-mx.c
@@ -146,7 +146,7 @@ int __init xtensa_mx_init_legacy(struct device_node *interrupt_parent)
irq_domain_add_legacy(NULL, NR_IRQS, 0, 0,
&xtensa_mx_irq_domain_ops,
&xtensa_mx_irq_chip);
- irq_set_default_host(root_domain);
+ irq_domain_set_default(root_domain);
secondary_init_irq();
return 0;
}
@@ -157,7 +157,7 @@ static int __init xtensa_mx_init(struct device_node *np,
struct irq_domain *root_domain =
irq_domain_add_linear(np, NR_IRQS, &xtensa_mx_irq_domain_ops,
&xtensa_mx_irq_chip);
- irq_set_default_host(root_domain);
+ irq_domain_set_default(root_domain);
secondary_init_irq();
return 0;
}
diff --git a/drivers/irqchip/irq-xtensa-pic.c b/drivers/irqchip/irq-xtensa-pic.c
index 7d71126d1ce5..74fecd0d5b7b 100644
--- a/drivers/irqchip/irq-xtensa-pic.c
+++ b/drivers/irqchip/irq-xtensa-pic.c
@@ -92,7 +92,7 @@ int __init xtensa_pic_init_legacy(struct device_node *interrupt_parent)
struct irq_domain *root_domain =
irq_domain_add_legacy(NULL, NR_IRQS, 0, 0,
&xtensa_irq_domain_ops, &xtensa_irq_chip);
- irq_set_default_host(root_domain);
+ irq_domain_set_default(root_domain);
return 0;
}

@@ -102,7 +102,7 @@ static int __init xtensa_pic_init(struct device_node *np,
struct irq_domain *root_domain =
irq_domain_add_linear(np, NR_IRQS, &xtensa_irq_domain_ops,
&xtensa_irq_chip);
- irq_set_default_host(root_domain);
+ irq_domain_set_default(root_domain);
return 0;
}
IRQCHIP_DECLARE(xtensa_irq_chip, "cdns,xtensa-pic", xtensa_pic_init);
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
index 508833c99418..42175687792e 100644
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -162,7 +162,7 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node,
const struct irq_domain_ops *ops,
void *host_data);
extern struct irq_domain *irq_domain_lookup(struct device_node *node);
-extern void irq_set_default_host(struct irq_domain *host);
+extern void irq_domain_set_default(struct irq_domain *d);

/**
* irq_domain_add_linear() - Allocate and register a linear revmap irq_domain.
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index b6f21eb6fe2d..344e4db1ea1c 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -96,7 +96,7 @@ void irq_domain_remove(struct irq_domain *domain)
* If the going away domain is the default one, reset it.
*/
if (unlikely(irq_default_domain == domain))
- irq_set_default_host(NULL);
+ irq_domain_set_default(NULL);

mutex_unlock(&irq_domain_mutex);

@@ -218,21 +218,21 @@ struct irq_domain *irq_domain_lookup(struct device_node *node)
EXPORT_SYMBOL_GPL(irq_domain_lookup);

/**
- * irq_set_default_host() - Set a "default" irq domain
- * @domain: default domain pointer
+ * irq_domain_set_default() - Set a "default" irq domain
+ * @: default domain pointer
*
* For convenience, it's possible to set a "default" domain that will be used
* whenever NULL is passed to irq_create_mapping(). It makes life easier for
* platforms that want to manipulate a few hard coded interrupt numbers that
* aren't properly represented in the device-tree.
*/
-void irq_set_default_host(struct irq_domain *domain)
+void irq_domain_set_default(struct irq_domain *d)
{
pr_debug("Default domain set to @0x%p\n", domain);

irq_default_domain = domain;
}
-EXPORT_SYMBOL_GPL(irq_set_default_host);
+EXPORT_SYMBOL_GPL(irq_domain_set_default);

void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq)
{
--
1.9.3

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