From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: linux-arch@vger.kernel.org, Linus Torvalds <torvalds@osdl.org>,
Andrew Morton <akpm@linux-foundation.org>,
x86@kernel.org, Peter Zijlstra <peterz@infradead.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Paul Mundt <lethal@linux-sh.org>,
Russell King <linux@arm.linux.org.uk>,
David Woodhouse <dwmw2@infradead.org>,
Jesse Barnes <jbarnes@virtuousgeek.org>,
Yinghai Lu <yinghai@kernel.org>,
Grant Likely <grant.likely@secretlab.ca>,
"Eric W. Biederman" <ebiederm@xmission.com>
Subject: [patch 14/47] genirq: Implement a sane sparse_irq allocator
Date: Thu, 30 Sep 2010 23:15:44 -0000 [thread overview]
Message-ID: <20100930221739.858896807@linutronix.de> (raw)
In-Reply-To: 20100930221351.682772535@linutronix.de
[-- Attachment #1: genirq-sparse-implement-sane-allocation-function.patch --]
[-- Type: text/plain, Size: 9905 bytes --]
The current sparse_irq allocator has several short comings due to
failures in the design or the lack of it:
- Requires iteration over the number of active irqs to find a free slot
(Some architectures have grown their own workarounds for this)
- Removal of entries is not possible
- Racy between create_irq_nr and destroy_irq (plugged by horrible
callbacks)
- Migration of active irq descriptors is not possible
- No bulk allocation of irq ranges
- Sprinkeled irq_desc references all over the place outside of kernel/irq/
(The previous chip functions series is addressing this issue)
Implement a sane allocator which fixes the above short comings (though
migration of active descriptors needs a full tree wide cleanup of the
direct and mostly unlocked access to irq_desc).
The new allocator still uses a radix_tree, but uses a bitmap for
keeping track of allocated irq numbers. That allows:
- Fast lookup of a free slot
- Allows the removal of descriptors
- Prevents the create/destroy race
- Bulk allocation of consecutive irq ranges
- Basic design is ready for migration of life descriptors after
further cleanups
The bitmap is also used in the SPARSE_IRQ=n case for lookup and
raceless (de)allocation of irq numbers. So it removes the requirement
for looping through the descriptor array to find slots.
Right now it uses sparse_irq_lock to protect the bitmap and the radix
tree, but after cleaning up all users we should be able convert that
to a mutex and to switch the radix_tree and decriptor allocations to
GFP_KERNEL.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/irq.h | 25 +++++
kernel/irq/irqdesc.c | 226 +++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 243 insertions(+), 8 deletions(-)
Index: linux-2.6-tip/include/linux/irq.h
===================================================================
--- linux-2.6-tip.orig/include/linux/irq.h
+++ linux-2.6-tip/include/linux/irq.h
@@ -276,6 +276,31 @@ static inline struct irq_desc *move_irq_
extern struct irq_desc *irq_to_desc_alloc_node(unsigned int irq, int node);
+int irq_alloc_descs(unsigned int irq, unsigned int from, unsigned int cnt, int node);
+
+static inline int irq_alloc_desc(int node)
+{
+ return irq_alloc_descs(0, 0, 1, node);
+}
+
+static inline int
+irq_alloc_desc_at(unsigned int at, int node)
+{
+ return irq_alloc_descs(at, 0, 1, node);
+}
+
+static inline int
+irq_alloc_desc_from(unsigned int from, int node)
+{
+ return irq_alloc_descs(0, from, 1, node);
+}
+
+void irq_free_descs(unsigned int irq, unsigned int cnt);
+static inline void irq_free_desc(unsigned int irq)
+{
+ irq_free_descs(irq, 1);
+}
+
/*
* Pick up the arch-dependent methods:
*/
Index: linux-2.6-tip/kernel/irq/irqdesc.c
===================================================================
--- linux-2.6-tip.orig/kernel/irq/irqdesc.c
+++ linux-2.6-tip/kernel/irq/irqdesc.c
@@ -13,6 +13,7 @@
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
#include <linux/radix-tree.h>
+#include <linux/bitmap.h>
#include "internals.h"
@@ -33,9 +34,55 @@ static void __init init_irq_default_affi
}
#endif
+#ifdef CONFIG_SMP
+static int alloc_masks(struct irq_desc *desc, gfp_t gfp, int node)
+{
+ if (!zalloc_cpumask_var_node(&desc->affinity, gfp, node))
+ return -ENOMEM;
+
+#ifdef CONFIG_GENERIC_PENDING_IRQ
+ if (!zalloc_cpumask_var_node(&desc->pending_mask, gfp, node)) {
+ free_cpumask_var(desc->affinity);
+ return -ENOMEM;
+ }
+#endif
+ return 0;
+}
+
+static void desc_smp_init(struct irq_desc *desc, int node)
+{
+ desc->node = node;
+ desc->irq_data.affinity = &desc->affinity;
+ cpumask_copy(desc->affinity, irq_default_affinity);
+}
+
+#else
+static inline int
+alloc_masks(struct irq_desc *desc, gfp_t gfp, int node) { return 0; }
+static inline void desc_smp_init(struct irq_desc *desc, int node) { }
+#endif
+
+static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node)
+{
+ memset(&desc->irq_data, 0 , sizeof(desc->irq_data));
+ desc->irq = irq;
+ desc->irq_data.irq = irq;
+ desc->status = IRQ_DEFAULT_INIT_FLAGS;
+ desc->chip = &no_irq_chip;
+ desc->irq_data.chip = &no_irq_chip;
+ desc->handle_irq = handle_bad_irq;
+ desc->depth = 1;
+ desc->name = NULL;
+ memset(desc->kstat_irqs, 0, nr_cpu_ids * sizeof(*(desc->kstat_irqs)));
+ desc_smp_init(desc, node);
+}
+
int nr_irqs = NR_IRQS;
EXPORT_SYMBOL_GPL(nr_irqs);
+DEFINE_RAW_SPINLOCK(sparse_irq_lock);
+static DECLARE_BITMAP(allocated_irqs, NR_IRQS);
+
#ifdef CONFIG_SPARSE_IRQ
static struct irq_desc irq_desc_init = {
@@ -90,14 +137,9 @@ static void init_one_irq_desc(int irq, s
arch_init_chip_data(desc, node);
}
-/*
- * Protect the sparse_irqs:
- */
-DEFINE_RAW_SPINLOCK(sparse_irq_lock);
-
static RADIX_TREE(irq_desc_tree, GFP_ATOMIC);
-static void set_irq_desc(unsigned int irq, struct irq_desc *desc)
+static void irq_insert_desc(unsigned int irq, struct irq_desc *desc)
{
radix_tree_insert(&irq_desc_tree, irq, desc);
}
@@ -116,6 +158,93 @@ void replace_irq_desc(unsigned int irq,
radix_tree_replace_slot(ptr, desc);
}
+static void delete_irq_desc(unsigned int irq)
+{
+ radix_tree_delete(&irq_desc_tree, irq);
+}
+
+#ifdef CONFIG_SMP
+static void free_masks(struct irq_desc *desc)
+{
+#ifdef CONFIG_GENERIC_PENDING_IRQ
+ free_cpumask_var(desc->pending_mask);
+#endif
+ free_cpumask_var(desc->affinity);
+}
+#else
+static inline void free_masks(struct irq_desc *desc) { }
+#endif
+
+static struct irq_desc *alloc_desc(int irq, int node)
+{
+ struct irq_desc *desc;
+ gfp_t gfp = GFP_KERNEL;
+
+ desc = kzalloc_node(sizeof(*desc), gfp, node);
+ if (!desc)
+ return NULL;
+ desc->kstat_irqs = kzalloc_node(sizeof(*desc->kstat_irqs), gfp, node);
+ if (!desc)
+ goto err_desc;
+
+ if (alloc_masks(desc, gfp, node))
+ goto err_kstat;
+
+ raw_spin_lock_init(&desc->lock);
+ lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+
+ desc_set_defaults(irq, desc, node);
+
+ desc_smp_init(desc, node);
+ return desc;
+
+err_kstat:
+ kfree(desc->kstat_irqs);
+err_desc:
+ kfree(desc);
+ return NULL;
+}
+
+static void free_desc(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ unsigned long flags;
+
+ raw_spin_lock_irqsave(&sparse_irq_lock, flags);
+ delete_irq_desc(irq);
+ raw_spin_unlock_irqrestore(&sparse_irq_lock, flags);
+
+ free_masks(desc);
+ kfree(desc->kstat_irqs);
+ kfree(desc);
+}
+
+static int alloc_descs(unsigned int start, unsigned int cnt, int node)
+{
+ struct irq_desc *desc;
+ unsigned long flags;
+ int i;
+
+ for (i = 0; i < cnt; i++) {
+ desc = alloc_desc(start + i, node);
+ if (!desc)
+ goto err;
+ raw_spin_lock_irqsave(&sparse_irq_lock, flags);
+ irq_insert_desc(start + i, desc);
+ raw_spin_unlock_irqrestore(&sparse_irq_lock, flags);
+ }
+ return start;
+
+err:
+ for (i--; i >= 0; i--)
+ free_desc(start + i);
+
+ raw_spin_lock_irqsave(&sparse_irq_lock, flags);
+ bitmap_clear(allocated_irqs, start, cnt);
+ raw_spin_unlock_irqrestore(&sparse_irq_lock, flags);
+ return -ENOMEM;
+}
+
static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_smp = {
[0 ... NR_IRQS_LEGACY-1] = {
.irq = -1,
@@ -162,7 +291,7 @@ int __init early_irq_init(void)
lockdep_set_class(&desc[i].lock, &irq_desc_lock_class);
alloc_desc_masks(&desc[i], node, true);
init_desc_masks(&desc[i]);
- set_irq_desc(i, &desc[i]);
+ irq_insert_desc(i, &desc[i]);
}
return arch_early_irq_init();
@@ -199,7 +328,7 @@ struct irq_desc * __ref irq_to_desc_allo
}
init_one_irq_desc(irq, desc, node);
- set_irq_desc(irq, desc);
+ irq_insert_desc(irq, desc);
out_unlock:
raw_spin_unlock_irqrestore(&sparse_irq_lock, flags);
@@ -257,8 +386,89 @@ struct irq_desc *irq_to_desc_alloc_node(
{
return irq_to_desc(irq);
}
+
+static void free_desc(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ unsigned long flags;
+
+ raw_spin_lock_irqsave(&desc->lock, flags);
+#ifdef CONFIG_SMP
+ desc_set_defaults(irq, desc, desc->node);
+#else
+ desc_set_defaults(irq, desc, 0);
+#endif
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
+}
+
+static inline int alloc_descs(unsigned int start, unsigned int cnt, int node)
+{
+ return start;
+}
#endif /* !CONFIG_SPARSE_IRQ */
+/* Dynamic interrupt handling */
+
+/**
+ * irq_free_descs - free irq descriptors
+ * @from: Start of descriptor range
+ * @cnt: Number of consecutive irqs to free
+ */
+void irq_free_descs(unsigned int from, unsigned int cnt)
+{
+ unsigned long flags;
+ int i;
+
+ if (from >= nr_irqs || (from + cnt) > nr_irqs)
+ return;
+
+ for (i = 0; i < cnt; i++)
+ free_desc(from + i);
+
+ raw_spin_lock_irqsave(&sparse_irq_lock, flags);
+ bitmap_clear(allocated_irqs, from, cnt);
+ raw_spin_unlock_irqrestore(&sparse_irq_lock, flags);
+}
+
+/**
+ * irq_alloc_descs - allocate and initialize a range of irq descriptors
+ * @irq: Allocate for specific irq number if irq > 0
+ * @from: Start the search from this irq number
+ * @cnt: Number of consecutive irqs to allocate.
+ * @node: Preferred node on which the irq descriptor should be allocated
+ *
+ * Returns the first irq number or error code
+ */
+int __ref
+irq_alloc_descs(unsigned int irq, unsigned int from, unsigned int cnt, int node)
+{
+ unsigned long flags;
+ int start, ret;
+
+ if (!cnt)
+ return -EINVAL;
+
+ raw_spin_lock_irqsave(&sparse_irq_lock, flags);
+
+ start = bitmap_find_next_zero_area(allocated_irqs, nr_irqs, from, cnt, 0);
+ ret = -EEXIST;
+ if (irq && start != irq)
+ goto err;
+
+ ret = -ENOMEM;
+ if (start >= nr_irqs)
+ goto err;
+
+ bitmap_set(allocated_irqs, start, cnt);
+ raw_spin_unlock_irqrestore(&sparse_irq_lock, flags);
+ return alloc_descs(start, cnt, node);
+
+err:
+ raw_spin_unlock_irqrestore(&sparse_irq_lock, flags);
+ return ret;
+}
+
+/* Statistics access */
void clear_kstat_irqs(struct irq_desc *desc)
{
memset(desc->kstat_irqs, 0, nr_cpu_ids * sizeof(*(desc->kstat_irqs)));
next prev parent reply other threads:[~2010-09-30 23:15 UTC|newest]
Thread overview: 158+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-30 23:14 [patch 00/47] Sparse irq rework Thomas Gleixner
2010-09-30 23:14 ` [patch 01/47] x86: Plug memory leak in sparse irq Thomas Gleixner
2010-09-30 23:14 ` [patch 02/47] x86: Hpet: Fix bogus error check in hpet_assign_irq() Thomas Gleixner
2010-09-30 23:14 ` Thomas Gleixner
2010-09-30 23:14 ` [patch 03/47] genirq: Provide status modifier Thomas Gleixner
2010-09-30 23:14 ` Thomas Gleixner
2010-09-30 23:14 ` [patch 04/47] arm: Use irq " Thomas Gleixner
2010-09-30 23:14 ` Thomas Gleixner
2010-09-30 23:14 ` [patch 05/47] genirq-sanitize-irq-data-accessors.patch Thomas Gleixner
2010-09-30 23:14 ` Thomas Gleixner
2010-09-30 23:15 ` [patch 06/47] genirq: Distangle kernel/irq/handle.c Thomas Gleixner
2010-09-30 23:15 ` Thomas Gleixner
2010-09-30 23:15 ` [patch 07/47] genirq: Remove early_init_irq_lock_class() Thomas Gleixner
2010-09-30 23:15 ` Thomas Gleixner
2010-09-30 23:15 ` [patch 08/47] genirq: Move core only inlines to kernel/irq Thomas Gleixner
2010-09-30 23:15 ` [patch 09/47] isdn: hisax: Replace the bogus access to irq stats Thomas Gleixner
2010-09-30 23:15 ` Thomas Gleixner
2010-09-30 23:15 ` [patch 10/47] genirq: Remove export of kstat_irqs_cpu Thomas Gleixner
2010-09-30 23:15 ` [patch 11/47] genirq: Provide default irq init flags Thomas Gleixner
2010-09-30 23:15 ` Thomas Gleixner
2010-09-30 23:15 ` [patch 12/47] arm: Use ARCH_IRQ_INIT_FLAGS Thomas Gleixner
2010-09-30 23:15 ` [patch 13/47] powerpc: " Thomas Gleixner
2010-09-30 23:15 ` Thomas Gleixner
2010-09-30 23:15 ` Thomas Gleixner [this message]
2010-09-30 23:15 ` [patch 14/47] genirq: Implement a sane sparse_irq allocator Thomas Gleixner
2010-10-01 5:28 ` Yinghai Lu
2010-10-01 20:36 ` Thomas Gleixner
2010-09-30 23:15 ` [patch 15/47] genirq: Prepare proc for real sparse irq support Thomas Gleixner
2010-09-30 23:15 ` [patch 16/47] genirq: Implement sane enumeration Thomas Gleixner
2010-09-30 23:15 ` Thomas Gleixner
2010-10-03 10:55 ` Grant Likely
2010-09-30 23:15 ` [patch 17/47] genirq-update-kerneldoc.patch Thomas Gleixner
2010-09-30 23:15 ` Thomas Gleixner
2010-09-30 23:16 ` [patch 18/47] genirq: Use sane sparse allocator Thomas Gleixner
2010-09-30 23:16 ` Thomas Gleixner
2010-09-30 23:16 ` [patch 19/47] genirq: Query arch for number of early descriptors Thomas Gleixner
2010-09-30 23:16 ` Thomas Gleixner
2010-09-30 23:16 ` [patch 20/47] x86: Remove useless reinitialization of irq descriptors Thomas Gleixner
2010-09-30 23:16 ` Thomas Gleixner
2010-10-03 15:21 ` Eric W. Biederman
2010-10-03 18:26 ` Thomas Gleixner
2010-09-30 23:16 ` [patch 21/47] x86: Sanitize apb timer interrupt handling Thomas Gleixner
2010-09-30 23:16 ` Thomas Gleixner
2010-09-30 23:16 ` [patch 22/47] x86: lguest: Convert to new irq chip functions Thomas Gleixner
2010-09-30 23:16 ` [patch 23/47] x86: Cleanup visws interrupt handling Thomas Gleixner
2010-09-30 23:16 ` Thomas Gleixner
2010-09-30 23:16 ` [patch 24/47] x86: i8259: Convert to new irq_chip functions Thomas Gleixner
2010-09-30 23:16 ` Thomas Gleixner
2010-09-30 23:16 ` [patch 25/47] x86: Cleanup io_apic Thomas Gleixner
2010-09-30 23:16 ` [patch 26/47] x86: io_apic: Convert startup to new irq_chip function Thomas Gleixner
2010-09-30 23:16 ` Thomas Gleixner
2010-09-30 23:16 ` [patch 27/47] x86: ioapic: Convert mask " Thomas Gleixner
2010-09-30 23:16 ` [patch 28/47] x86: ioapic/hpet: Convert to new chip functions Thomas Gleixner
2010-09-30 23:16 ` Thomas Gleixner
2010-09-30 23:16 ` [patch 29/47] pci: Convert msi to new irq_chip functions Thomas Gleixner
2010-09-30 23:16 ` Thomas Gleixner
2010-10-11 17:09 ` Jesse Barnes
2010-10-11 17:09 ` Jesse Barnes
2010-09-30 23:16 ` [patch 30/47] dmar: Convert to new irq chip functions Thomas Gleixner
2010-09-30 23:17 ` [patch 31/47] ht: Convert to new irq_chip functions Thomas Gleixner
2010-09-30 23:17 ` Thomas Gleixner
2010-09-30 23:17 ` [patch 32/47] x86: ioapic: Clean up the direct access to irq_desc Thomas Gleixner
2010-09-30 23:17 ` Thomas Gleixner
2010-09-30 23:17 ` [patch 33/47] pci: Cleanup the irq_desc mess in msi Thomas Gleixner
2010-10-11 17:08 ` Jesse Barnes
2010-10-11 17:08 ` Jesse Barnes
2010-09-30 23:17 ` [patch 34/47] x86: ioapic: Convert irq affinity to new chip functions Thomas Gleixner
2010-09-30 23:17 ` [patch 35/47] x86: ioapic: Cleanup some more Thomas Gleixner
2010-09-30 23:17 ` [patch 36/47] x86: ioapic: Cleanup sparse irq code Thomas Gleixner
2010-09-30 23:17 ` Thomas Gleixner
2010-09-30 23:17 ` [patch 37/47] x86: uv: Clean up the direct access to irq_desc Thomas Gleixner
2010-09-30 23:17 ` [patch 38/47] x86: Use sane enumeration Thomas Gleixner
2010-09-30 23:17 ` [patch 39/47] genirq: Remove arch_init_chip_data() Thomas Gleixner
2010-09-30 23:17 ` [patch 40/47] genirq: Sanitize dynamic irq handling Thomas Gleixner
2010-09-30 23:17 ` Thomas Gleixner
2010-10-01 5:47 ` Yinghai Lu
2010-09-30 23:18 ` [patch 41/47] arm: davinci: Cleanup irq_desc access Thomas Gleixner
2010-09-30 23:18 ` Thomas Gleixner
2010-09-30 23:18 ` [patch 42/47] genirq: Remove the now unused sparse irq leftovers Thomas Gleixner
2010-09-30 23:18 ` Thomas Gleixner
2010-09-30 23:18 ` [patch 43/47] x86: xen: Sanitise sparse_irq handling Thomas Gleixner
2010-09-30 23:18 ` Thomas Gleixner
2010-09-30 23:18 ` [patch 44/47] sh: Sanitize sparse irq Thomas Gleixner
2010-09-30 23:18 ` [patch 45/47] x86: lguest: Use new irq allocator Thomas Gleixner
2010-09-30 23:18 ` Thomas Gleixner
2010-09-30 23:18 ` [patch 46/47] powerpc: " Thomas Gleixner
2010-09-30 23:18 ` Thomas Gleixner
2010-10-01 0:42 ` Benjamin Herrenschmidt
2010-10-01 13:07 ` Thomas Gleixner
2010-10-01 20:46 ` Benjamin Herrenschmidt
2010-10-01 21:11 ` Grant Likely
2010-10-01 21:17 ` Benjamin Herrenschmidt
2010-10-03 16:53 ` Eric W. Biederman
2010-10-03 16:53 ` Eric W. Biederman
2010-10-03 18:34 ` Thomas Gleixner
2010-10-03 20:04 ` Thomas Gleixner
2010-10-03 22:54 ` Benjamin Herrenschmidt
2010-10-03 22:54 ` Benjamin Herrenschmidt
2010-10-04 0:15 ` Eric W. Biederman
2010-10-04 0:37 ` Benjamin Herrenschmidt
2010-10-04 16:46 ` Grant Likely
2010-09-30 23:18 ` [patch 47/47] genirq: Remove the old sparse irq allocator function Thomas Gleixner
2010-09-30 23:18 ` Thomas Gleixner
2010-10-01 3:32 ` [patch 00/47] Sparse irq rework Linus Torvalds
2010-10-01 3:32 ` Linus Torvalds
2010-10-01 5:54 ` Yinghai Lu
2010-10-01 5:54 ` Yinghai Lu
2010-10-01 20:35 ` Thomas Gleixner
2010-10-03 11:23 ` Grant Likely
2010-10-03 11:29 ` Russell King - ARM Linux
2010-10-03 11:29 ` Russell King - ARM Linux
2010-10-03 11:57 ` Grant Likely
2010-10-03 13:48 ` Thomas Gleixner
2010-10-05 10:22 ` Thomas Gleixner
2010-10-05 10:22 ` Thomas Gleixner
2010-10-06 22:45 ` Yinghai Lu
2010-10-06 22:52 ` Thomas Gleixner
2010-10-06 23:37 ` Yinghai Lu
2010-10-07 0:16 ` Yinghai Lu
2010-10-07 4:01 ` Thomas Gleixner
2010-10-07 4:38 ` Yinghai Lu
2010-10-08 21:50 ` Thomas Gleixner
2010-10-08 21:54 ` Thomas Gleixner
2010-10-09 4:26 ` Yinghai Lu
2010-10-09 5:44 ` Yinghai Lu
2010-10-09 6:34 ` Thomas Gleixner
2010-10-09 7:08 ` Yinghai Lu
2010-10-09 7:08 ` Yinghai Lu
2010-10-09 12:08 ` Thomas Gleixner
2010-10-10 9:32 ` Thomas Gleixner
2010-10-10 9:32 ` Thomas Gleixner
2010-10-10 13:30 ` Anca Emanuel
2010-10-11 2:20 ` Yinghai Lu
2010-10-11 2:20 ` Yinghai Lu
2010-10-11 3:50 ` Yinghai Lu
2010-10-11 3:50 ` Yinghai Lu
2010-10-11 8:16 ` Thomas Gleixner
2010-10-11 11:34 ` Benjamin Herrenschmidt
2010-10-11 16:19 ` Yinghai Lu
2010-10-11 16:19 ` Yinghai Lu
2010-10-09 6:10 ` Thomas Gleixner
2010-10-09 7:03 ` Yinghai Lu
2010-10-09 12:12 ` Thomas Gleixner
2010-10-10 2:32 ` Yinghai Lu
2010-10-10 2:32 ` Yinghai Lu
2010-10-10 5:11 ` Yinghai Lu
2010-10-10 5:11 ` Yinghai Lu
2010-10-10 8:20 ` Thomas Gleixner
2010-10-03 16:41 ` Eric W. Biederman
2010-10-03 16:41 ` Eric W. Biederman
2010-10-03 19:16 ` Thomas Gleixner
2010-10-03 22:57 ` Benjamin Herrenschmidt
2010-10-04 16:31 ` Grant Likely
2010-10-04 0:49 ` Eric W. Biederman
2010-10-04 8:05 ` Thomas Gleixner
2010-10-04 1:13 ` Eric W. Biederman
2010-10-04 1:13 ` Eric W. Biederman
2010-10-04 6:36 ` Ingo Molnar
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=20100930221739.858896807@linutronix.de \
--to=tglx@linutronix.de \
--cc=akpm@linux-foundation.org \
--cc=benh@kernel.crashing.org \
--cc=dwmw2@infradead.org \
--cc=ebiederm@xmission.com \
--cc=grant.likely@secretlab.ca \
--cc=jbarnes@virtuousgeek.org \
--cc=lethal@linux-sh.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=peterz@infradead.org \
--cc=torvalds@osdl.org \
--cc=x86@kernel.org \
--cc=yinghai@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).