* [PATCH 00/13] Re: Scalability requirements for sysv ipc
@ 2008-04-11 16:17 Nadia.Derbey
2008-04-11 16:17 ` [PATCH 01/13] duplicate idr code Nadia.Derbey
` (16 more replies)
0 siblings, 17 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul
Here is finally the ipc ridr-based implementation I was talking about last
week (see http://lkml.org/lkml/2008/4/4/208).
I couldn't avoid much of the code duplication, but at least made things
incremental.
Does somebody now a test suite that exists for the idr API, that I could
run on this new api?
Mike, can you try to run it on your victim: I had such a hard time building
this patch, that I couldn't re-run the test on my 8-core with this new
version. So the last results I have are for 2.6.25-rc3-mm1.
Also, I think a careful review should be done to avoid introducing yet other
problems :-(
*WARNING*: this patch contains a fix for idr.c
I know, I'm doing things bad, but I only saw the problem this
afternoon.
It should be applied on linux-2.6.25-rc8-mm1, in the following order:
[ PATCH 01/13 ] : copy_idr_code.patch
[ PATCH 02/13 ] : change_ridr_struct.patch
[ PATCH 03/13 ] : ridr_pre_get.patch
[ PATCH 04/13 ] : ridr_alloc_layer.patch
[ PATCH 05/13 ] : ridr_free_layer.patch
[ PATCH 06/13 ] : ridr_sub_alloc.patch
[ PATCH 07/13 ] : ridr_get_empty_slot.patch
[ PATCH 08/13 ] : ridr_get_new.patch
[ PATCH 09/13 ] : ridr_remove.patch
[ PATCH 10/13 ] : ridr_find.patch
[ PATCH 11/13 ] : ridr_integrate.patch
[ PATCH 12/13 ] : ipc_use_ridr.patch
[ PATCH 13/13 ] : remove_ipc_lock_down.patch
Regards,
Nadia
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 01/13] duplicate idr code
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 02/13] Change ridr structure Nadia.Derbey
` (15 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: copy_idr_code.patch --]
[-- Type: text/plain, Size: 10946 bytes --]
[PATCH 01/13]
This patch duplicates idr.c and idr.h, only changing the routines and
structures names where needed.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
include/linux/ridr.h | 58 +++++++
lib/ridr.c | 386 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 444 insertions(+)
Index: linux-2.6.25-rc8-mm1/include/linux/ridr.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.25-rc8-mm1/include/linux/ridr.h 2008-04-11 17:17:41.000000000 +0200
@@ -0,0 +1,58 @@
+/*
+ * include/linux/ridr.h
+ *
+ * Small id to pointer translation service avoiding fixed sized
+ * tables. RCU-based implmentation of IDRs.
+ */
+
+#ifndef _RIDR_H_
+#define _RIDR_H_
+
+#include <linux/idr.h>
+
+struct ridr_layer {
+ unsigned long bitmap; /* A zero bit means "space here" */
+ struct ridr_layer *ary[1<<IDR_BITS];
+ int count; /* When zero, we can release it */
+};
+
+struct ridr {
+ struct ridr_layer *top;
+ struct ridr_layer *id_free;
+ int layers;
+ int id_free_cnt;
+ spinlock_t lock;
+};
+
+#define RIDR_INIT(name) \
+{ \
+ .top = NULL, \
+ .id_free = NULL, \
+ .layers = 0, \
+ .id_free_cnt = 0, \
+ .lock = __SPIN_LOCK_UNLOCKED(name.lock), \
+}
+#define DEFINE_RIDR(name) struct ridr name = RIDR_INIT(name)
+
+#define INIT_RIDR(name) \
+do { \
+ (name)->top = NULL; \
+ (name)->id_free = NULL; \
+ (name)->layers = 0; \
+ (name)->id_free_cnt = 0; \
+ (name)->lock = __SPIN_LOCK_UNLOCKED(name.lock); \
+} while (0)
+
+
+/*
+ * This is what we export.
+ */
+
+void *ridr_find(struct ridr *idp, int id);
+int ridr_pre_get(struct ridr *idp, gfp_t gfp_mask);
+int ridr_get_new(struct ridr *idp, void *ptr, int *id);
+void ridr_remove(struct ridr *idp, int id);
+
+void __init ridr_init_cache(void);
+
+#endif /* _RIDR_H_ */
Index: linux-2.6.25-rc8-mm1/lib/ridr.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.25-rc8-mm1/lib/ridr.c 2008-04-11 17:30:28.000000000 +0200
@@ -0,0 +1,386 @@
+/*
+ * RCU-based idr API
+ */
+
+#ifndef TEST /* to test in user space... */
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#endif
+#include <linux/err.h>
+#include <linux/string.h>
+#include <linux/ridr.h>
+
+static struct kmem_cache *ridr_layer_cache;
+
+static struct ridr_layer *alloc_layer(struct ridr *idp)
+{
+ struct ridr_layer *p;
+ unsigned long flags;
+
+ spin_lock_irqsave(&idp->lock, flags);
+ p = idp->id_free;
+ if (p) {
+ idp->id_free = p->ary[0];
+ idp->id_free_cnt--;
+ p->ary[0] = NULL;
+ }
+ spin_unlock_irqrestore(&idp->lock, flags);
+ return(p);
+}
+
+/* only called when idp->lock is held */
+static void __free_layer(struct ridr *idp, struct ridr_layer *p)
+{
+ p->ary[0] = idp->id_free;
+ idp->id_free = p;
+ idp->id_free_cnt++;
+}
+
+static void free_layer(struct ridr *idp, struct ridr_layer *p)
+{
+ unsigned long flags;
+
+ /*
+ * Depends on the return element being zeroed.
+ */
+ spin_lock_irqsave(&idp->lock, flags);
+ __free_layer(idp, p);
+ spin_unlock_irqrestore(&idp->lock, flags);
+}
+
+static void ridr_mark_full(struct ridr_layer **pa, int id)
+{
+ struct ridr_layer *p = pa[0];
+ int l = 0;
+
+ __set_bit(id & IDR_MASK, &p->bitmap);
+ /*
+ * If this layer is full mark the bit in the layer above to
+ * show that this part of the radix tree is full. This may
+ * complete the layer above and require walking up the radix
+ * tree.
+ */
+ while (p->bitmap == IDR_FULL) {
+ p = pa[++l];
+ if (!p)
+ break;
+ id = id >> IDR_BITS;
+ __set_bit((id & IDR_MASK), &p->bitmap);
+ }
+}
+
+/**
+ * ridr_pre_get - reserver resources for ridr allocation
+ * @idp: ridr handle
+ * @gfp_mask: memory allocation flags
+ *
+ * This function should be called prior to locking and calling the
+ * following function. It preallocates enough memory to satisfy
+ * the worst possible allocation.
+ *
+ * If the system is REALLY out of memory this function returns 0,
+ * otherwise 1.
+ */
+int ridr_pre_get(struct ridr *idp, gfp_t gfp_mask)
+{
+ while (idp->id_free_cnt < IDR_FREE_MAX) {
+ struct ridr_layer *new;
+ new = kmem_cache_alloc(ridr_layer_cache, gfp_mask);
+ if (new == NULL)
+ return (0);
+ free_layer(idp, new);
+ }
+ return 1;
+}
+EXPORT_SYMBOL(ridr_pre_get);
+
+static int sub_alloc(struct ridr *idp, int *starting_id,
+ struct ridr_layer **pa)
+{
+ int n, m, sh;
+ struct ridr_layer *p, *new;
+ int l, id, oid;
+ unsigned long bm;
+
+ id = *starting_id;
+ restart:
+ p = idp->top;
+ l = idp->layers;
+ pa[l--] = NULL;
+ while (1) {
+ /*
+ * We run around this while until we reach the leaf node...
+ */
+ n = (id >> (IDR_BITS*l)) & IDR_MASK;
+ bm = ~p->bitmap;
+ m = find_next_bit(&bm, IDR_SIZE, n);
+ if (m == IDR_SIZE) {
+ /* no space available go back to previous layer. */
+ l++;
+ oid = id;
+ id = (id | ((1 << (IDR_BITS * l)) - 1)) + 1;
+
+ /* if already at the top layer, we need to grow */
+ p = pa[l];
+ if (!p) {
+ *starting_id = id;
+ return -2;
+ }
+
+ /* If we need to go up one layer, continue the
+ * loop; otherwise, restart from the top.
+ */
+ sh = IDR_BITS * (l + 1);
+ if (oid >> sh == id >> sh)
+ continue;
+ else
+ goto restart;
+ }
+ if (m != n) {
+ sh = IDR_BITS*l;
+ id = ((id >> sh) ^ n ^ m) << sh;
+ }
+ if ((id >= MAX_ID_BIT) || (id < 0))
+ return -3;
+ if (l == 0)
+ break;
+ /*
+ * Create the layer below if it is missing.
+ */
+ if (!p->ary[m]) {
+ new = alloc_layer(idp);
+ if (!new)
+ return -1;
+ p->ary[m] = new;
+ p->count++;
+ }
+ pa[l--] = p;
+ p = p->ary[m];
+ }
+
+ pa[l] = p;
+ return id;
+}
+
+static int ridr_get_empty_slot(struct ridr *idp, int starting_id,
+ struct ridr_layer **pa)
+{
+ struct ridr_layer *p, *new;
+ int layers, v, id;
+ unsigned long flags;
+
+ id = starting_id;
+build_up:
+ p = idp->top;
+ layers = idp->layers;
+ if (unlikely(!p)) {
+ p = alloc_layer(idp);
+ if (!p)
+ return -1;
+ layers = 1;
+ }
+ /*
+ * Add a new layer to the top of the tree if the requested
+ * id is larger than the currently allocated space.
+ */
+ while ((layers < (MAX_LEVEL - 1)) && (id >= (1 << (layers*IDR_BITS)))) {
+ layers++;
+ if (!p->count)
+ continue;
+ new = alloc_layer(idp);
+ if (!new) {
+ /*
+ * The allocation failed. If we built part of
+ * the structure tear it down.
+ */
+ spin_lock_irqsave(&idp->lock, flags);
+ for (new = p; p && p != idp->top; new = p) {
+ p = p->ary[0];
+ new->ary[0] = NULL;
+ new->bitmap = new->count = 0;
+ __free_layer(idp, new);
+ }
+ spin_unlock_irqrestore(&idp->lock, flags);
+ return -1;
+ }
+ new->ary[0] = p;
+ new->count = 1;
+ if (p->bitmap == IDR_FULL)
+ __set_bit(0, &new->bitmap);
+ p = new;
+ }
+ idp->top = p;
+ idp->layers = layers;
+ v = sub_alloc(idp, &id, pa);
+ if (v == -2)
+ goto build_up;
+ return(v);
+}
+
+static int ridr_get_new_above_int(struct ridr *idp, void *ptr, int starting_id)
+{
+ struct ridr_layer *pa[MAX_LEVEL];
+ int id;
+
+ id = ridr_get_empty_slot(idp, starting_id, pa);
+ if (id >= 0) {
+ /*
+ * Successfully found an empty slot. Install the user
+ * pointer and mark the slot full.
+ */
+ pa[0]->ary[id & IDR_MASK] = (struct ridr_layer *)ptr;
+ pa[0]->count++;
+ ridr_mark_full(pa, id);
+ }
+
+ return id;
+}
+
+/**
+ * ridr_get_new - allocate new ridr entry
+ * @idp: ridr handle
+ * @ptr: pointer you want associated with the ide
+ * @id: pointer to the allocated handle
+ *
+ * This is the allocate id function. It should be called with any
+ * required locks.
+ *
+ * If memory is required, it will return -EAGAIN, you should unlock
+ * and go back to the ridr_pre_get() call. If the ridr is full, it will
+ * return -ENOSPC.
+ *
+ * @id returns a value in the range 0 ... 0x7fffffff
+ */
+int ridr_get_new(struct ridr *idp, void *ptr, int *id)
+{
+ int rv;
+
+ rv = ridr_get_new_above_int(idp, ptr, 0);
+ /*
+ * This is a cheap hack until the IDR code can be fixed to
+ * return proper error values.
+ */
+ if (rv < 0) {
+ if (rv == -1)
+ return -EAGAIN;
+ else /* Will be -3 */
+ return -ENOSPC;
+ }
+ *id = rv;
+ return 0;
+}
+EXPORT_SYMBOL(ridr_get_new);
+
+static void ridr_remove_warning(int id)
+{
+ printk("ridr_remove called for id=%d which is not allocated.\n", id);
+ dump_stack();
+}
+
+static void sub_remove(struct ridr *idp, int shift, int id)
+{
+ struct ridr_layer *p = idp->top;
+ struct ridr_layer **pa[MAX_LEVEL];
+ struct ridr_layer ***paa = &pa[0];
+ int n;
+
+ *paa = NULL;
+ *++paa = &idp->top;
+
+ while ((shift > 0) && p) {
+ n = (id >> shift) & IDR_MASK;
+ __clear_bit(n, &p->bitmap);
+ *++paa = &p->ary[n];
+ p = p->ary[n];
+ shift -= IDR_BITS;
+ }
+ n = id & IDR_MASK;
+ if (likely(p != NULL && test_bit(n, &p->bitmap))) {
+ __clear_bit(n, &p->bitmap);
+ p->ary[n] = NULL;
+ while (*paa && !--((**paa)->count)) {
+ free_layer(idp, **paa);
+ **paa-- = NULL;
+ }
+ if (!*paa)
+ idp->layers = 0;
+ } else
+ ridr_remove_warning(id);
+}
+
+/**
+ * ridr_remove - remove the given id and free it's slot
+ * @idp: ridr handle
+ * @id: unique key
+ */
+void ridr_remove(struct ridr *idp, int id)
+{
+ struct ridr_layer *p;
+
+ /* Mask off upper bits we don't use for the search. */
+ id &= MAX_ID_MASK;
+
+ sub_remove(idp, (idp->layers - 1) * IDR_BITS, id);
+ if (idp->top && idp->top->count == 1 && (idp->layers > 1) &&
+ idp->top->ary[0]) { /* We can drop a layer */
+
+ p = idp->top->ary[0];
+ idp->top->bitmap = idp->top->count = 0;
+ free_layer(idp, idp->top);
+ idp->top = p;
+ --idp->layers;
+ }
+ while (idp->id_free_cnt >= IDR_FREE_MAX) {
+ p = alloc_layer(idp);
+ kmem_cache_free(ridr_layer_cache, p);
+ return;
+ }
+}
+EXPORT_SYMBOL(ridr_remove);
+
+/**
+ * ridr_find - return pointer for given id
+ * @idp: ridr handle
+ * @id: lookup key
+ *
+ * Return the pointer given the id it has been registered with. A %NULL
+ * return indicates that @id is not valid or you passed %NULL in
+ * ridr_get_new().
+ *
+ * The caller must serialize ridr_find() vs ridr_get_new() and ridr_remove().
+ */
+void *ridr_find(struct ridr *idp, int id)
+{
+ int n;
+ struct ridr_layer *p;
+
+ n = idp->layers * IDR_BITS;
+ p = idp->top;
+
+ /* Mask off upper bits we don't use for the search. */
+ id &= MAX_ID_MASK;
+
+ if (id >= (1 << n))
+ return NULL;
+
+ while (n > 0 && p) {
+ n -= IDR_BITS;
+ p = p->ary[(id >> n) & IDR_MASK];
+ }
+ return((void *)p);
+}
+EXPORT_SYMBOL(ridr_find);
+
+static void ridr_cache_ctor(struct kmem_cache *ridr_layer_cache,
+ void *ridr_layer)
+{
+ memset(ridr_layer, 0, sizeof(struct ridr_layer));
+}
+
+void __init ridr_init_cache(void)
+{
+ ridr_layer_cache = kmem_cache_create("ridr_layer_cache",
+ sizeof(struct ridr_layer), 0, SLAB_PANIC,
+ ridr_cache_ctor);
+}
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 02/13] Change ridr structure
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
2008-04-11 16:17 ` [PATCH 01/13] duplicate idr code Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 03/13] Fix ridr_pre_get() Nadia.Derbey
` (14 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: change_ridr_struct.patch --]
[-- Type: text/plain, Size: 2519 bytes --]
[PATCH 02/13]
This patch changes the ridr structures to make them use RCU.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
include/linux/ridr.h | 42 +++++++++++++++++++++++++++---------------
1 file changed, 27 insertions(+), 15 deletions(-)
Index: linux-2.6.25-rc8-mm1/include/linux/ridr.h
===================================================================
--- linux-2.6.25-rc8-mm1.orig/include/linux/ridr.h 2008-04-11 17:17:41.000000000 +0200
+++ linux-2.6.25-rc8-mm1/include/linux/ridr.h 2008-04-11 17:34:35.000000000 +0200
@@ -9,41 +9,53 @@
#define _RIDR_H_
#include <linux/idr.h>
+#include <linux/rcupdate.h>
struct ridr_layer {
unsigned long bitmap; /* A zero bit means "space here" */
struct ridr_layer *ary[1<<IDR_BITS];
int count; /* When zero, we can release it */
+ struct rcu_head rcu_head;
};
struct ridr {
- struct ridr_layer *top;
- struct ridr_layer *id_free;
int layers;
- int id_free_cnt;
- spinlock_t lock;
+ gfp_t gfp_mask;
+ struct ridr_layer *top;
};
-#define RIDR_INIT(name) \
+#define RIDR_INIT(mask) \
{ \
- .top = NULL, \
- .id_free = NULL, \
.layers = 0, \
- .id_free_cnt = 0, \
- .lock = __SPIN_LOCK_UNLOCKED(name.lock), \
+ .gfp_mask = (mask), \
+ .top = NULL, \
}
-#define DEFINE_RIDR(name) struct ridr name = RIDR_INIT(name)
+#define DEFINE_RIDR(name, mask) struct ridr name = RIDR_INIT(mask)
-#define INIT_RIDR(name) \
+#define INIT_RIDR(name, mask) \
do { \
- (name)->top = NULL; \
- (name)->id_free = NULL; \
(name)->layers = 0; \
- (name)->id_free_cnt = 0; \
- (name)->lock = __SPIN_LOCK_UNLOCKED(name.lock); \
+ (name)->gfp_mask = (mask); \
+ (name)->top = NULL; \
} while (0)
+/**
+ * Ridr synchronization (see radix-tree.h)
+ *
+ * ridr_find() is able to be called locklessly, using RCU. The caller must
+ * ensure calls to this function are made within rcu_read_lock() regions.
+ * Other readers (lock-free or otherwise) and modifications may be running
+ * concurrently.
+ *
+ * It is still required that the caller manage the synchronization and
+ * lifetimes of the items. So if RCU lock-free lookups are used, typically
+ * this would mean that the items have their own locks, or are amenable to
+ * lock-free access; and that the items are freed by RCU (or only freed after
+ * having been deleted from the ridr tree *and* a synchronize_rcu() grace
+ * period).
+ */
+
/*
* This is what we export.
*/
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 03/13] Fix ridr_pre_get()
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
2008-04-11 16:17 ` [PATCH 01/13] duplicate idr code Nadia.Derbey
2008-04-11 16:17 ` [PATCH 02/13] Change ridr structure Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 04/13] Fix ridr_alloc_layer() Nadia.Derbey
` (13 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ridr_pre_get.patch --]
[-- Type: text/plain, Size: 3220 bytes --]
[PATCH 03/13]
This patch only fixes the ridr_pre_get() portion of ridr.c, to introduce a
per-cpu pool of preloaded ridr layer structures, and define the
ridr_pre_get[_end]() routines.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
include/linux/ridr.h | 7 ++++++-
lib/ridr.c | 50 ++++++++++++++++++++++++++++++++++++--------------
2 files changed, 42 insertions(+), 15 deletions(-)
Index: linux-2.6.25-rc8-mm1/include/linux/ridr.h
===================================================================
--- linux-2.6.25-rc8-mm1.orig/include/linux/ridr.h 2008-04-11 17:34:35.000000000 +0200
+++ linux-2.6.25-rc8-mm1/include/linux/ridr.h 2008-04-11 17:41:20.000000000 +0200
@@ -61,10 +61,15 @@ do { \
*/
void *ridr_find(struct ridr *idp, int id);
-int ridr_pre_get(struct ridr *idp, gfp_t gfp_mask);
+int ridr_pre_get(gfp_t gfp_mask);
int ridr_get_new(struct ridr *idp, void *ptr, int *id);
void ridr_remove(struct ridr *idp, int id);
void __init ridr_init_cache(void);
+static inline void ridr_pre_get_end(void)
+{
+ preempt_enable();
+}
+
#endif /* _RIDR_H_ */
Index: linux-2.6.25-rc8-mm1/lib/ridr.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/ridr.c 2008-04-11 17:30:28.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/ridr.c 2008-04-11 17:40:13.000000000 +0200
@@ -13,6 +13,15 @@
static struct kmem_cache *ridr_layer_cache;
+/*
+ * Per-cpu pool of preloaded layers
+ */
+struct ridr_preget {
+ int nr;
+ struct ridr_layer *layers[MAX_LEVEL];
+};
+DEFINE_PER_CPU(struct ridr_preget, ridr_pregets) = { 0, };
+
static struct ridr_layer *alloc_layer(struct ridr *idp)
{
struct ridr_layer *p;
@@ -75,23 +84,36 @@ static void ridr_mark_full(struct ridr_l
* @idp: ridr handle
* @gfp_mask: memory allocation flags
*
- * This function should be called prior to locking and calling the
- * following function. It preallocates enough memory to satisfy
- * the worst possible allocation.
+ * Load up this CPU's ridr_layer buffer with sufficient objects to
+ * ensure that the addition of a single element in the tree cannot fail.
*
- * If the system is REALLY out of memory this function returns 0,
- * otherwise 1.
+ * If the system is REALLY out of memory this function returns 0, with
+ * preemption enabled.
+ * Otherwise 1, with preemption disabled.
*/
-int ridr_pre_get(struct ridr *idp, gfp_t gfp_mask)
+int ridr_pre_get(gfp_t gfp_mask)
{
- while (idp->id_free_cnt < IDR_FREE_MAX) {
- struct ridr_layer *new;
- new = kmem_cache_alloc(ridr_layer_cache, gfp_mask);
- if (new == NULL)
- return (0);
- free_layer(idp, new);
- }
- return 1;
+ struct ridr_preget *idp;
+ struct ridr_layer *layer;
+ int ret = 0;
+
+ preempt_disable();
+ idp = &__get_cpu_var(ridr_pregets);
+ while (idp->nr < ARRAY_SIZE(idp->layers)) {
+ preempt_enable();
+ layer = kmem_cache_alloc(ridr_layer_cache, gfp_mask);
+ if (layer == NULL)
+ goto out;
+ preempt_disable();
+ idp = &__get_cpu_var(ridr_pregets);
+ if (idp->nr < ARRAY_SIZE(idp->layers))
+ idp->layers[idp->nr++] = layer;
+ else
+ kmem_cache_free(ridr_layer_cache, layer);
+ }
+ ret = 1;
+out:
+ return ret;
}
EXPORT_SYMBOL(ridr_pre_get);
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 04/13] Fix ridr_alloc_layer()
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (2 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 03/13] Fix ridr_pre_get() Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 05/13] Fix free_layer() Nadia.Derbey
` (12 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ridr_alloc_layer.patch --]
[-- Type: text/plain, Size: 1675 bytes --]
[PATCH 04/13]
This patch only fixes the alloc_layer() portion of ridr.c, to make it use the
per-cpu pool of preloaded ridr layer structures.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
lib/ridr.c | 35 +++++++++++++++++++++++++----------
1 file changed, 25 insertions(+), 10 deletions(-)
Index: linux-2.6.25-rc8-mm1/lib/ridr.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/ridr.c 2008-04-11 17:40:13.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/ridr.c 2008-04-11 17:43:44.000000000 +0200
@@ -22,20 +22,35 @@ struct ridr_preget {
};
DEFINE_PER_CPU(struct ridr_preget, ridr_pregets) = { 0, };
+static inline gfp_t ridr_gfp_mask(struct ridr *idp)
+{
+ return idp->gfp_mask & __GFP_BITS_MASK;
+}
+
static struct ridr_layer *alloc_layer(struct ridr *idp)
{
- struct ridr_layer *p;
- unsigned long flags;
+ struct ridr_layer *ret = NULL;
+ gfp_t gfp_mask = ridr_gfp_mask(idp);
- spin_lock_irqsave(&idp->lock, flags);
- p = idp->id_free;
- if (p) {
- idp->id_free = p->ary[0];
- idp->id_free_cnt--;
- p->ary[0] = NULL;
+ if (!(gfp_mask & __GFP_WAIT)) {
+ struct ridr_preget *ridp;
+
+ /*
+ * Provided the caller has preloaded here, we will always
+ * succeed in getting a node here (and never reach
+ * kmem_cache_alloc)
+ */
+ ridp = &__get_cpu_var(ridr_pregets);
+ if (ridp->nr) {
+ ret = ridp->layers[ridp->nr - 1];
+ ridp->layers[ridp->nr - 1] = NULL;
+ ridp->nr--;
+ }
}
- spin_unlock_irqrestore(&idp->lock, flags);
- return(p);
+ if (ret == NULL)
+ ret = kmem_cache_alloc(ridr_layer_cache, gfp_mask);
+
+ return ret;
}
/* only called when idp->lock is held */
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 05/13] Fix free_layer()
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (3 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 04/13] Fix ridr_alloc_layer() Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 06/13] Fix sub_alloc() Nadia.Derbey
` (11 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ridr_free_layer.patch --]
[-- Type: text/plain, Size: 2096 bytes --]
[PATCH 05/13]
This patch only fixes the free_layer() portion of ridr.c, to make it use
call_rcu().
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
lib/ridr.c | 27 ++++++++++-----------------
1 file changed, 10 insertions(+), 17 deletions(-)
Index: linux-2.6.25-rc8-mm1/lib/ridr.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/ridr.c 2008-04-11 17:43:44.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/ridr.c 2008-04-11 17:47:48.000000000 +0200
@@ -53,24 +53,17 @@ static struct ridr_layer *alloc_layer(st
return ret;
}
-/* only called when idp->lock is held */
-static void __free_layer(struct ridr *idp, struct ridr_layer *p)
+static void ridr_layer_rcu_free(struct rcu_head *head)
{
- p->ary[0] = idp->id_free;
- idp->id_free = p;
- idp->id_free_cnt++;
+ struct ridr_layer *layer;
+
+ layer = container_of(head, struct ridr_layer, rcu_head);
+ kmem_cache_free(ridr_layer_cache, layer);
}
-static void free_layer(struct ridr *idp, struct ridr_layer *p)
+static inline void free_layer(struct ridr_layer *p)
{
- unsigned long flags;
-
- /*
- * Depends on the return element being zeroed.
- */
- spin_lock_irqsave(&idp->lock, flags);
- __free_layer(idp, p);
- spin_unlock_irqrestore(&idp->lock, flags);
+ call_rcu(&p->rcu_head, ridr_layer_rcu_free);
}
static void ridr_mark_full(struct ridr_layer **pa, int id)
@@ -236,7 +229,7 @@ build_up:
p = p->ary[0];
new->ary[0] = NULL;
new->bitmap = new->count = 0;
- __free_layer(idp, new);
+ free_layer(new);
}
spin_unlock_irqrestore(&idp->lock, flags);
return -1;
@@ -337,7 +330,7 @@ static void sub_remove(struct ridr *idp,
__clear_bit(n, &p->bitmap);
p->ary[n] = NULL;
while (*paa && !--((**paa)->count)) {
- free_layer(idp, **paa);
+ free_layer(**paa);
**paa-- = NULL;
}
if (!*paa)
@@ -364,7 +357,7 @@ void ridr_remove(struct ridr *idp, int i
p = idp->top->ary[0];
idp->top->bitmap = idp->top->count = 0;
- free_layer(idp, idp->top);
+ free_layer(idp->top);
idp->top = p;
--idp->layers;
}
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 06/13] Fix sub_alloc()
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (4 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 05/13] Fix free_layer() Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 07/13] Fix get_empty_slot() Nadia.Derbey
` (10 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ridr_sub_alloc.patch --]
[-- Type: text/plain, Size: 1408 bytes --]
[PATCH 06/13]
This patch only fixes the sub_alloc() portion of ridr.c, to make it RCU based.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
lib/ridr.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
Index: linux-2.6.25-rc8-mm1/lib/ridr.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/ridr.c 2008-04-11 17:47:48.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/ridr.c 2008-04-11 17:51:34.000000000 +0200
@@ -135,9 +135,9 @@ static int sub_alloc(struct ridr *idp, i
id = *starting_id;
restart:
- p = idp->top;
+ rcu_assign_pointer(p, idp->top);
l = idp->layers;
- pa[l--] = NULL;
+ rcu_assign_pointer(pa[l--], NULL);
while (1) {
/*
* We run around this while until we reach the leaf node...
@@ -152,7 +152,7 @@ static int sub_alloc(struct ridr *idp, i
id = (id | ((1 << (IDR_BITS * l)) - 1)) + 1;
/* if already at the top layer, we need to grow */
- p = pa[l];
+ rcu_assign_pointer(p, pa[l]);
if (!p) {
*starting_id = id;
return -2;
@@ -182,14 +182,14 @@ static int sub_alloc(struct ridr *idp, i
new = alloc_layer(idp);
if (!new)
return -1;
- p->ary[m] = new;
+ rcu_assign_pointer(p->ary[m], new);
p->count++;
}
- pa[l--] = p;
+ rcu_assign_pointer(pa[l--], p);
p = p->ary[m];
}
- pa[l] = p;
+ rcu_assign_pointer(pa[l], p);
return id;
}
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 07/13] Fix get_empty_slot()
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (5 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 06/13] Fix sub_alloc() Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 08/13] Fix ridr_get_new_above_int() Nadia.Derbey
` (9 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ridr_get_empty_slot.patch --]
[-- Type: text/plain, Size: 1372 bytes --]
[PATCH 07/13]
This patch only fixes the ridr_get_empty_slot() portion of ridr.c, to make
it RCU based.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
lib/ridr.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
Index: linux-2.6.25-rc8-mm1/lib/ridr.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/ridr.c 2008-04-11 17:51:34.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/ridr.c 2008-04-11 17:55:37.000000000 +0200
@@ -198,7 +198,6 @@ static int ridr_get_empty_slot(struct ri
{
struct ridr_layer *p, *new;
int layers, v, id;
- unsigned long flags;
id = starting_id;
build_up:
@@ -224,23 +223,21 @@ build_up:
* The allocation failed. If we built part of
* the structure tear it down.
*/
- spin_lock_irqsave(&idp->lock, flags);
for (new = p; p && p != idp->top; new = p) {
p = p->ary[0];
new->ary[0] = NULL;
new->bitmap = new->count = 0;
free_layer(new);
}
- spin_unlock_irqrestore(&idp->lock, flags);
return -1;
}
- new->ary[0] = p;
+ rcu_assign_pointer(new->ary[0], p);
new->count = 1;
if (p->bitmap == IDR_FULL)
__set_bit(0, &new->bitmap);
- p = new;
+ rcu_assign_pointer(p, new);
}
- idp->top = p;
+ rcu_assign_pointer(idp->top, p);
idp->layers = layers;
v = sub_alloc(idp, &id, pa);
if (v == -2)
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 08/13] Fix ridr_get_new_above_int()
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (6 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 07/13] Fix get_empty_slot() Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 09/13] Fix ridr_remove() Nadia.Derbey
` (8 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ridr_get_new.patch --]
[-- Type: text/plain, Size: 1418 bytes --]
[PATCH 08/13]
This patch only fixes the ridr_get_new_above_int() portion of ridr.c, to make
it RCU based.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
lib/ridr.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
Index: linux-2.6.25-rc8-mm1/lib/ridr.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/ridr.c 2008-04-11 17:55:37.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/ridr.c 2008-04-11 17:58:41.000000000 +0200
@@ -256,7 +256,8 @@ static int ridr_get_new_above_int(struct
* Successfully found an empty slot. Install the user
* pointer and mark the slot full.
*/
- pa[0]->ary[id & IDR_MASK] = (struct ridr_layer *)ptr;
+ rcu_assign_pointer(pa[0]->ary[id & IDR_MASK],
+ (struct ridr_layer *)ptr);
pa[0]->count++;
ridr_mark_full(pa, id);
}
@@ -273,9 +274,9 @@ static int ridr_get_new_above_int(struct
* This is the allocate id function. It should be called with any
* required locks.
*
- * If memory is required, it will return -EAGAIN, you should unlock
- * and go back to the ridr_pre_get() call. If the ridr is full, it will
- * return -ENOSPC.
+ * If memory is required, it will return -EAGAIN, you should unlock, enable
+ * preemption and go back to the ridr_pre_get() call.
+ * If the ridr is full, it will return -ENOSPC.
*
* @id returns a value in the range 0 ... 0x7fffffff
*/
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 09/13] Fix ridr_remove()
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (7 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 08/13] Fix ridr_get_new_above_int() Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 10/13] Fix ridr_find() Nadia.Derbey
` (7 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ridr_remove.patch --]
[-- Type: text/plain, Size: 4009 bytes --]
[PATCH 09/13]
This patch only fixes the sub_remove() and ridr_remove() portions of ridr.c,
to make them RCU based.
Note: also fixes idr_remove(): looks like there is a return that is not at the
right place.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
include/linux/idr.h | 1 +
lib/idr.c | 9 +++++----
lib/ridr.c | 29 +++++++++++++----------------
3 files changed, 19 insertions(+), 20 deletions(-)
Index: linux-2.6.25-rc8-mm1/lib/ridr.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/ridr.c 2008-04-11 17:58:41.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/ridr.c 2008-04-11 18:04:08.000000000 +0200
@@ -300,17 +300,12 @@ int ridr_get_new(struct ridr *idp, void
}
EXPORT_SYMBOL(ridr_get_new);
-static void ridr_remove_warning(int id)
-{
- printk("ridr_remove called for id=%d which is not allocated.\n", id);
- dump_stack();
-}
-
static void sub_remove(struct ridr *idp, int shift, int id)
{
struct ridr_layer *p = idp->top;
struct ridr_layer **pa[MAX_LEVEL];
struct ridr_layer ***paa = &pa[0];
+ struct ridr_layer *to_free;
int n;
*paa = NULL;
@@ -327,14 +322,19 @@ static void sub_remove(struct ridr *idp,
if (likely(p != NULL && test_bit(n, &p->bitmap))) {
__clear_bit(n, &p->bitmap);
p->ary[n] = NULL;
+ to_free = NULL;
while (*paa && !--((**paa)->count)) {
- free_layer(**paa);
+ if (to_free)
+ free_layer(to_free);
+ to_free = **paa;
**paa-- = NULL;
}
if (!*paa)
idp->layers = 0;
+ if (to_free)
+ free_layer(to_free);
} else
- ridr_remove_warning(id);
+ idr_remove_warning("ridr_remove", id);
}
/**
@@ -344,7 +344,7 @@ static void sub_remove(struct ridr *idp,
*/
void ridr_remove(struct ridr *idp, int id)
{
- struct ridr_layer *p;
+ struct ridr_layer *p, *to_free;
/* Mask off upper bits we don't use for the search. */
id &= MAX_ID_MASK;
@@ -353,17 +353,14 @@ void ridr_remove(struct ridr *idp, int i
if (idp->top && idp->top->count == 1 && (idp->layers > 1) &&
idp->top->ary[0]) { /* We can drop a layer */
+ to_free = idp->top;
p = idp->top->ary[0];
- idp->top->bitmap = idp->top->count = 0;
- free_layer(idp->top);
idp->top = p;
--idp->layers;
+ to_free->bitmap = to_free->count = 0;
+ free_layer(to_free);
}
- while (idp->id_free_cnt >= IDR_FREE_MAX) {
- p = alloc_layer(idp);
- kmem_cache_free(ridr_layer_cache, p);
- return;
- }
+ return;
}
EXPORT_SYMBOL(ridr_remove);
Index: linux-2.6.25-rc8-mm1/include/linux/idr.h
===================================================================
--- linux-2.6.25-rc8-mm1.orig/include/linux/idr.h 2008-04-11 17:14:05.000000000 +0200
+++ linux-2.6.25-rc8-mm1/include/linux/idr.h 2008-04-11 18:05:09.000000000 +0200
@@ -117,5 +117,6 @@ void ida_destroy(struct ida *ida);
void ida_init(struct ida *ida);
void __init idr_init_cache(void);
+void idr_remove_warning(const char *, int);
#endif /* __IDR_H__ */
Index: linux-2.6.25-rc8-mm1/lib/idr.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/idr.c 2008-04-11 17:14:08.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/idr.c 2008-04-11 18:06:46.000000000 +0200
@@ -323,9 +323,10 @@ int idr_get_new(struct idr *idp, void *p
}
EXPORT_SYMBOL(idr_get_new);
-static void idr_remove_warning(int id)
+void idr_remove_warning(const char *name, int id)
{
- printk("idr_remove called for id=%d which is not allocated.\n", id);
+ printk(KERN_WARNING
+ "%s called for id=%d which is not allocated.\n", name, id);
dump_stack();
}
@@ -357,7 +358,7 @@ static void sub_remove(struct idr *idp,
if (!*paa)
idp->layers = 0;
} else
- idr_remove_warning(id);
+ idr_remove_warning("idr_remove", id);
}
/**
@@ -385,8 +386,8 @@ void idr_remove(struct idr *idp, int id)
while (idp->id_free_cnt >= IDR_FREE_MAX) {
p = alloc_layer(idp);
kmem_cache_free(idr_layer_cache, p);
- return;
}
+ return;
}
EXPORT_SYMBOL(idr_remove);
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 10/13] Fix ridr_find()
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (8 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 09/13] Fix ridr_remove() Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 11/13] Integrate the ridr code Nadia.Derbey
` (6 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ridr_find.patch --]
[-- Type: text/plain, Size: 955 bytes --]
[PATCH 10/13]
This patch only fixes the ridr_find() portion of ridr.c,
to make it RCU based.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
lib/ridr.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: linux-2.6.25-rc8-mm1/lib/ridr.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/ridr.c 2008-04-11 18:04:08.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/ridr.c 2008-04-11 18:09:00.000000000 +0200
@@ -381,7 +381,7 @@ void *ridr_find(struct ridr *idp, int id
struct ridr_layer *p;
n = idp->layers * IDR_BITS;
- p = idp->top;
+ p = rcu_dereference(idp->top);
/* Mask off upper bits we don't use for the search. */
id &= MAX_ID_MASK;
@@ -391,7 +391,7 @@ void *ridr_find(struct ridr *idp, int id
while (n > 0 && p) {
n -= IDR_BITS;
- p = p->ary[(id >> n) & IDR_MASK];
+ p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]);
}
return((void *)p);
}
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 11/13] Integrate the ridr code
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (9 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 10/13] Fix ridr_find() Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 12/13] Integrate the ridr code into IPC code Nadia.Derbey
` (5 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ridr_integrate.patch --]
[-- Type: text/plain, Size: 1573 bytes --]
[PATCH 11/13]
>From now on the ridr code can be compiled and used (the initialization routine
is called during kernel init).
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
init/main.c | 2 ++
lib/Makefile | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
Index: linux-2.6.25-rc8-mm1/lib/Makefile
===================================================================
--- linux-2.6.25-rc8-mm1.orig/lib/Makefile 2008-04-11 17:14:08.000000000 +0200
+++ linux-2.6.25-rc8-mm1/lib/Makefile 2008-04-11 18:10:26.000000000 +0200
@@ -6,7 +6,7 @@ lib-y := ctype.o string.o vsprintf.o cmd
rbtree.o radix-tree.o dump_stack.o \
idr.o int_sqrt.o extable.o prio_tree.o \
sha1.o irq_regs.o reciprocal_div.o argv_split.o \
- proportions.o prio_heap.o ratelimit.o
+ proportions.o prio_heap.o ratelimit.o ridr.o
lib-$(CONFIG_MMU) += ioremap.o
lib-$(CONFIG_SMP) += cpumask.o
Index: linux-2.6.25-rc8-mm1/init/main.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/init/main.c 2008-04-11 17:14:32.000000000 +0200
+++ linux-2.6.25-rc8-mm1/init/main.c 2008-04-11 18:11:01.000000000 +0200
@@ -60,6 +60,7 @@
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/idr.h>
+#include <linux/ridr.h>
#include <asm/io.h>
#include <asm/bugs.h>
@@ -636,6 +637,7 @@ asmlinkage void __init start_kernel(void
security_init();
vfs_caches_init(num_physpages);
radix_tree_init();
+ ridr_init_cache();
signals_init();
/* rootfs populating might need page-writeback */
page_writeback_init();
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 12/13] Integrate the ridr code into IPC code
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (10 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 11/13] Integrate the ridr code Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:17 ` [PATCH 13/13] Get rid of ipc_lock_down() Nadia.Derbey
` (4 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: ipc_use_ridr.patch --]
[-- Type: text/plain, Size: 7497 bytes --]
[PATCH 12/13]
This patche makes the ipc ode use the ridr api.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
include/linux/ipc_namespace.h | 4 +--
ipc/namespace.c | 2 -
ipc/shm.c | 2 -
ipc/util.c | 44 ++++++++++++++++++------------------------
4 files changed, 23 insertions(+), 29 deletions(-)
Index: linux-2.6.25-rc8-mm1/include/linux/ipc_namespace.h
===================================================================
--- linux-2.6.25-rc8-mm1.orig/include/linux/ipc_namespace.h 2008-04-11 17:14:05.000000000 +0200
+++ linux-2.6.25-rc8-mm1/include/linux/ipc_namespace.h 2008-04-11 18:12:18.000000000 +0200
@@ -2,7 +2,7 @@
#define __IPC_NAMESPACE_H__
#include <linux/err.h>
-#include <linux/idr.h>
+#include <linux/ridr.h>
#include <linux/rwsem.h>
#include <linux/notifier.h>
@@ -21,7 +21,7 @@ struct ipc_ids {
unsigned short seq;
unsigned short seq_max;
struct rw_semaphore rw_mutex;
- struct idr ipcs_idr;
+ struct ridr ipcs_ridr;
};
struct ipc_namespace {
Index: linux-2.6.25-rc8-mm1/ipc/namespace.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/ipc/namespace.c 2008-04-11 17:14:32.000000000 +0200
+++ linux-2.6.25-rc8-mm1/ipc/namespace.c 2008-04-11 18:12:51.000000000 +0200
@@ -74,7 +74,7 @@ void free_ipcs(struct ipc_namespace *ns,
in_use = ids->in_use;
for (total = 0, next_id = 0; total < in_use; next_id++) {
- perm = idr_find(&ids->ipcs_idr, next_id);
+ perm = ridr_find(&ids->ipcs_ridr, next_id);
if (perm == NULL)
continue;
ipc_lock_by_ptr(perm);
Index: linux-2.6.25-rc8-mm1/ipc/shm.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/ipc/shm.c 2008-04-11 17:14:32.000000000 +0200
+++ linux-2.6.25-rc8-mm1/ipc/shm.c 2008-04-11 18:13:13.000000000 +0200
@@ -571,7 +571,7 @@ static void shm_get_stat(struct ipc_name
struct shmid_kernel *shp;
struct inode *inode;
- shp = idr_find(&shm_ids(ns).ipcs_idr, next_id);
+ shp = ridr_find(&shm_ids(ns).ipcs_ridr, next_id);
if (shp == NULL)
continue;
Index: linux-2.6.25-rc8-mm1/ipc/util.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/ipc/util.c 2008-04-11 17:14:32.000000000 +0200
+++ linux-2.6.25-rc8-mm1/ipc/util.c 2008-04-11 18:17:08.000000000 +0200
@@ -122,7 +122,7 @@ __initcall(ipc_init);
* @ids: Identifier set
*
* Set up the sequence range to use for the ipc identifier range (limited
- * below IPCMNI) then initialise the ids idr.
+ * below IPCMNI) then initialise the ids ridr.
*/
void ipc_init_ids(struct ipc_ids *ids)
@@ -139,7 +139,7 @@ void ipc_init_ids(struct ipc_ids *ids)
ids->seq_max = seq_limit;
}
- idr_init(&ids->ipcs_idr);
+ INIT_RIDR(&ids->ipcs_ridr, GFP_KERNEL);
}
#ifdef CONFIG_PROC_FS
@@ -195,7 +195,7 @@ static struct kern_ipc_perm *ipc_findkey
int total;
for (total = 0, next_id = 0; total < ids->in_use; next_id++) {
- ipc = idr_find(&ids->ipcs_idr, next_id);
+ ipc = ridr_find(&ids->ipcs_ridr, next_id);
if (ipc == NULL)
continue;
@@ -234,7 +234,7 @@ int ipc_get_maxid(struct ipc_ids *ids)
/* Look for the last assigned id */
total = 0;
for (id = 0; id < IPCMNI && total < ids->in_use; id++) {
- ipc = idr_find(&ids->ipcs_idr, id);
+ ipc = ridr_find(&ids->ipcs_ridr, id);
if (ipc != NULL) {
max_id = id;
total++;
@@ -249,7 +249,7 @@ int ipc_get_maxid(struct ipc_ids *ids)
* @new: new IPC permission set
* @size: limit for the number of used ids
*
- * Add an entry 'new' to the IPC ids idr. The permissions object is
+ * Add an entry 'new' to the IPC ids ridr. The permissions object is
* initialised and the first free entry is set up and the id assigned
* is returned. The 'new' entry is returned in a locked state on success.
* On failure the entry is not locked and a negative err-code is returned.
@@ -267,7 +267,7 @@ int ipc_addid(struct ipc_ids* ids, struc
if (ids->in_use >= size)
return -ENOSPC;
- err = idr_get_new(&ids->ipcs_idr, new, &id);
+ err = ridr_get_new(&ids->ipcs_ridr, new, &id);
if (err)
return err;
@@ -303,7 +303,7 @@ static int ipcget_new(struct ipc_namespa
{
int err;
retry:
- err = idr_pre_get(&ids->ipcs_idr, GFP_KERNEL);
+ err = ridr_pre_get(GFP_KERNEL);
if (!err)
return -ENOMEM;
@@ -312,6 +312,8 @@ retry:
err = ops->getnew(ns, params);
up_write(&ids->rw_mutex);
+ ridr_pre_get_end();
+
if (err == -EAGAIN)
goto retry;
@@ -369,7 +371,7 @@ static int ipcget_public(struct ipc_name
int flg = params->flg;
int err;
retry:
- err = idr_pre_get(&ids->ipcs_idr, GFP_KERNEL);
+ err = ridr_pre_get(GFP_KERNEL);
/*
* Take the lock as a writer since we are potentially going to add
@@ -404,6 +406,7 @@ retry:
ipc_unlock(ipcp);
}
up_write(&ids->rw_mutex);
+ ridr_pre_get_end();
if (err == -EAGAIN)
goto retry;
@@ -425,7 +428,7 @@ void ipc_rmid(struct ipc_ids *ids, struc
{
int lid = ipcid_to_idx(ipcp->id);
- idr_remove(&ids->ipcs_idr, lid);
+ ridr_remove(&ids->ipcs_ridr, lid);
ids->in_use--;
@@ -686,13 +689,9 @@ void ipc64_perm_to_ipc_perm (struct ipc6
* @ids: IPC identifier set
* @id: ipc id to look for
*
- * Look for an id in the ipc ids idr and lock the associated ipc object.
+ * Look for an id in the ipc ids ridr and lock the associated ipc object.
*
* The ipc object is locked on exit.
- *
- * This is the routine that should be called when the rw_mutex is not already
- * held, i.e. idr tree not protected: it protects the idr tree in read mode
- * during the idr_find().
*/
struct kern_ipc_perm *ipc_lock(struct ipc_ids *ids, int id)
@@ -700,18 +699,13 @@ struct kern_ipc_perm *ipc_lock(struct ip
struct kern_ipc_perm *out;
int lid = ipcid_to_idx(id);
- down_read(&ids->rw_mutex);
-
rcu_read_lock();
- out = idr_find(&ids->ipcs_idr, lid);
+ out = ridr_find(&ids->ipcs_ridr, lid);
if (out == NULL) {
rcu_read_unlock();
- up_read(&ids->rw_mutex);
return ERR_PTR(-EINVAL);
}
- up_read(&ids->rw_mutex);
-
spin_lock(&out->lock);
/* ipc_rmid() may have already freed the ID while ipc_lock
@@ -731,12 +725,12 @@ struct kern_ipc_perm *ipc_lock(struct ip
* @ids: IPC identifier set
* @id: ipc id to look for
*
- * Look for an id in the ipc ids idr and lock the associated ipc object.
+ * Look for an id in the ipc ids ridr and lock the associated ipc object.
*
* The ipc object is locked on exit.
*
* This is the routine that should be called when the rw_mutex is already
- * held, i.e. idr tree protected.
+ * held, i.e. ridr tree protected.
*/
struct kern_ipc_perm *ipc_lock_down(struct ipc_ids *ids, int id)
@@ -745,7 +739,7 @@ struct kern_ipc_perm *ipc_lock_down(stru
int lid = ipcid_to_idx(id);
rcu_read_lock();
- out = idr_find(&ids->ipcs_idr, lid);
+ out = ridr_find(&ids->ipcs_ridr, lid);
if (out == NULL) {
rcu_read_unlock();
return ERR_PTR(-EINVAL);
@@ -916,7 +910,7 @@ static struct kern_ipc_perm *sysvipc_fin
total = 0;
for (id = 0; id < pos && total < ids->in_use; id++) {
- ipc = idr_find(&ids->ipcs_idr, id);
+ ipc = ridr_find(&ids->ipcs_ridr, id);
if (ipc != NULL)
total++;
}
@@ -925,7 +919,7 @@ static struct kern_ipc_perm *sysvipc_fin
return NULL;
for ( ; pos < IPCMNI; pos++) {
- ipc = idr_find(&ids->ipcs_idr, pos);
+ ipc = ridr_find(&ids->ipcs_ridr, pos);
if (ipc != NULL) {
*new_pos = pos + 1;
ipc_lock_by_ptr(ipc);
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 13/13] Get rid of ipc_lock_down()
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (11 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 12/13] Integrate the ridr code into IPC code Nadia.Derbey
@ 2008-04-11 16:17 ` Nadia.Derbey
2008-04-11 16:27 ` [PATCH 00/13] Re: Scalability requirements for sysv ipc Peter Zijlstra
` (3 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Nadia.Derbey @ 2008-04-11 16:17 UTC (permalink / raw)
To: efault; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul, Nadia Derbey
[-- Attachment #1: remove_ipc_lock_down.patch --]
[-- Type: text/plain, Size: 4605 bytes --]
[PATCH 13/13]
With the previous patch ipc_lock() becomes lockless.
So there is no need anymore for ipc_lock_down()-like routines.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
---
ipc/shm.c | 21 +++------------------
ipc/util.c | 52 +---------------------------------------------------
ipc/util.h | 6 ------
3 files changed, 4 insertions(+), 75 deletions(-)
Index: linux-2.6.25-rc8-mm1/ipc/util.h
===================================================================
--- linux-2.6.25-rc8-mm1.orig/ipc/util.h 2008-04-11 17:14:32.000000000 +0200
+++ linux-2.6.25-rc8-mm1/ipc/util.h 2008-04-11 18:18:44.000000000 +0200
@@ -102,11 +102,6 @@ void* ipc_rcu_alloc(int size);
void ipc_rcu_getref(void *ptr);
void ipc_rcu_putref(void *ptr);
-/*
- * ipc_lock_down: called with rw_mutex held
- * ipc_lock: called without that lock held
- */
-struct kern_ipc_perm *ipc_lock_down(struct ipc_ids *, int);
struct kern_ipc_perm *ipc_lock(struct ipc_ids *, int);
void kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out);
@@ -155,7 +150,6 @@ static inline void ipc_unlock(struct ker
rcu_read_unlock();
}
-struct kern_ipc_perm *ipc_lock_check_down(struct ipc_ids *ids, int id);
struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids, int id);
int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
struct ipc_ops *ops, struct ipc_params *params);
Index: linux-2.6.25-rc8-mm1/ipc/util.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/ipc/util.c 2008-04-11 18:17:08.000000000 +0200
+++ linux-2.6.25-rc8-mm1/ipc/util.c 2008-04-11 18:19:45.000000000 +0200
@@ -720,56 +720,6 @@ struct kern_ipc_perm *ipc_lock(struct ip
return out;
}
-/**
- * ipc_lock_down - Lock an ipc structure with rw_sem held
- * @ids: IPC identifier set
- * @id: ipc id to look for
- *
- * Look for an id in the ipc ids ridr and lock the associated ipc object.
- *
- * The ipc object is locked on exit.
- *
- * This is the routine that should be called when the rw_mutex is already
- * held, i.e. ridr tree protected.
- */
-
-struct kern_ipc_perm *ipc_lock_down(struct ipc_ids *ids, int id)
-{
- struct kern_ipc_perm *out;
- int lid = ipcid_to_idx(id);
-
- rcu_read_lock();
- out = ridr_find(&ids->ipcs_ridr, lid);
- if (out == NULL) {
- rcu_read_unlock();
- return ERR_PTR(-EINVAL);
- }
-
- spin_lock(&out->lock);
-
- /*
- * No need to verify that the structure is still valid since the
- * rw_mutex is held.
- */
- return out;
-}
-
-struct kern_ipc_perm *ipc_lock_check_down(struct ipc_ids *ids, int id)
-{
- struct kern_ipc_perm *out;
-
- out = ipc_lock_down(ids, id);
- if (IS_ERR(out))
- return out;
-
- if (ipc_checkid(out, id)) {
- ipc_unlock(out);
- return ERR_PTR(-EIDRM);
- }
-
- return out;
-}
-
struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids, int id)
{
struct kern_ipc_perm *out;
@@ -841,7 +791,7 @@ struct kern_ipc_perm *ipcctl_pre_down(st
int err;
down_write(&ids->rw_mutex);
- ipcp = ipc_lock_check_down(ids, id);
+ ipcp = ipc_lock_check(ids, id);
if (IS_ERR(ipcp)) {
err = PTR_ERR(ipcp);
goto out_up;
Index: linux-2.6.25-rc8-mm1/ipc/shm.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/ipc/shm.c 2008-04-11 18:13:13.000000000 +0200
+++ linux-2.6.25-rc8-mm1/ipc/shm.c 2008-04-11 18:20:44.000000000 +0200
@@ -112,23 +112,8 @@ void __init shm_init (void)
}
/*
- * shm_lock_(check_)down routines are called in the paths where the rw_mutex
- * is held to protect access to the idr tree.
- */
-static inline struct shmid_kernel *shm_lock_down(struct ipc_namespace *ns,
- int id)
-{
- struct kern_ipc_perm *ipcp = ipc_lock_down(&shm_ids(ns), id);
-
- if (IS_ERR(ipcp))
- return (struct shmid_kernel *)ipcp;
-
- return container_of(ipcp, struct shmid_kernel, shm_perm);
-}
-
-/*
* shm_lock_(check_) routines are called in the paths where the rw_mutex
- * is not held.
+ * is not necessarily held.
*/
static inline struct shmid_kernel *shm_lock(struct ipc_namespace *ns, int id)
{
@@ -211,7 +196,7 @@ static void shm_close(struct vm_area_str
down_write(&shm_ids(ns).rw_mutex);
/* remove from the list of attaches of the shm segment */
- shp = shm_lock_down(ns, sfd->id);
+ shp = shm_lock(ns, sfd->id);
BUG_ON(IS_ERR(shp));
shp->shm_lprid = task_tgid_vnr(current);
shp->shm_dtim = get_seconds();
@@ -935,7 +920,7 @@ invalid:
out_nattch:
down_write(&shm_ids(ns).rw_mutex);
- shp = shm_lock_down(ns, shmid);
+ shp = shm_lock(ns, shmid);
BUG_ON(IS_ERR(shp));
shp->shm_nattch--;
if(shp->shm_nattch == 0 &&
--
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (12 preceding siblings ...)
2008-04-11 16:17 ` [PATCH 13/13] Get rid of ipc_lock_down() Nadia.Derbey
@ 2008-04-11 16:27 ` Peter Zijlstra
2008-04-14 5:18 ` Nadia Derbey
2008-04-14 13:54 ` Mike Galbraith
` (2 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: Peter Zijlstra @ 2008-04-11 16:27 UTC (permalink / raw)
To: Nadia.Derbey; +Cc: efault, manfred, linux-kernel, paulmck, akpm, xemul
On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
>
> Here is finally the ipc ridr-based implementation I was talking about last
> week (see http://lkml.org/lkml/2008/4/4/208).
> I couldn't avoid much of the code duplication, but at least made things
> incremental.
>
> Does somebody now a test suite that exists for the idr API, that I could
> run on this new api?
>
> Mike, can you try to run it on your victim: I had such a hard time building
> this patch, that I couldn't re-run the test on my 8-core with this new
> version. So the last results I have are for 2.6.25-rc3-mm1.
>
> Also, I think a careful review should be done to avoid introducing yet other
> problems :-(
Why duplicate the whole thing, when we converted the Radix tree to be
RCU safe we did it in-place. Is there a reason this is not done for idr?
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-11 16:27 ` [PATCH 00/13] Re: Scalability requirements for sysv ipc Peter Zijlstra
@ 2008-04-14 5:18 ` Nadia Derbey
2008-04-14 7:15 ` Peter Zijlstra
0 siblings, 1 reply; 30+ messages in thread
From: Nadia Derbey @ 2008-04-14 5:18 UTC (permalink / raw)
To: Peter Zijlstra; +Cc: efault, manfred, linux-kernel, paulmck, akpm, xemul
Peter Zijlstra wrote:
> On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
>
>>Here is finally the ipc ridr-based implementation I was talking about last
>>week (see http://lkml.org/lkml/2008/4/4/208).
>>I couldn't avoid much of the code duplication, but at least made things
>>incremental.
>>
>>Does somebody now a test suite that exists for the idr API, that I could
>>run on this new api?
>>
>>Mike, can you try to run it on your victim: I had such a hard time building
>>this patch, that I couldn't re-run the test on my 8-core with this new
>>version. So the last results I have are for 2.6.25-rc3-mm1.
>>
>>Also, I think a careful review should be done to avoid introducing yet other
>>problems :-(
>
>
> Why duplicate the whole thing, when we converted the Radix tree to be
> RCU safe we did it in-place. Is there a reason this is not done for idr?
>
>
>
I did that because I wanted to go fast and try to fix the performance
problem we have with sysV ipc's. I didn't want to introduce (yet other)
regressions in the code that uses idr's today and that works well ;-)
May be in the future if this rcu based api appears to be ok, we can
replace one with the other?
Regards,
Nadia
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-14 5:18 ` Nadia Derbey
@ 2008-04-14 7:15 ` Peter Zijlstra
2008-04-14 8:33 ` Nadia Derbey
0 siblings, 1 reply; 30+ messages in thread
From: Peter Zijlstra @ 2008-04-14 7:15 UTC (permalink / raw)
To: Nadia Derbey; +Cc: efault, manfred, linux-kernel, paulmck, akpm, xemul
On Mon, 2008-04-14 at 07:18 +0200, Nadia Derbey wrote:
> Peter Zijlstra wrote:
> > On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
> >
> >>Here is finally the ipc ridr-based implementation I was talking about last
> >>week (see http://lkml.org/lkml/2008/4/4/208).
> >>I couldn't avoid much of the code duplication, but at least made things
> >>incremental.
> >>
> >>Does somebody now a test suite that exists for the idr API, that I could
> >>run on this new api?
> >>
> >>Mike, can you try to run it on your victim: I had such a hard time building
> >>this patch, that I couldn't re-run the test on my 8-core with this new
> >>version. So the last results I have are for 2.6.25-rc3-mm1.
> >>
> >>Also, I think a careful review should be done to avoid introducing yet other
> >>problems :-(
> >
> >
> > Why duplicate the whole thing, when we converted the Radix tree to be
> > RCU safe we did it in-place. Is there a reason this is not done for idr?
> >
> >
> >
>
> I did that because I wanted to go fast and try to fix the performance
> problem we have with sysV ipc's. I didn't want to introduce (yet other)
> regressions in the code that uses idr's today and that works well ;-)
> May be in the future if this rcu based api appears to be ok, we can
> replace one with the other?
>From what I can see the API doesn't change at all, so I don't see why
you need to duplicate - either the new code works as expected or its
broken. If it works its good enough for all IDR users, if its broken we
should fix it. Seems simple enough.. am I missing something obvious?
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-14 7:15 ` Peter Zijlstra
@ 2008-04-14 8:33 ` Nadia Derbey
2008-04-14 10:52 ` Nadia Derbey
` (2 more replies)
0 siblings, 3 replies; 30+ messages in thread
From: Nadia Derbey @ 2008-04-14 8:33 UTC (permalink / raw)
To: Peter Zijlstra; +Cc: efault, manfred, linux-kernel, paulmck, akpm, xemul
Peter Zijlstra wrote:
> On Mon, 2008-04-14 at 07:18 +0200, Nadia Derbey wrote:
>
>>Peter Zijlstra wrote:
>>
>>>On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
>>>
>>>
>>>>Here is finally the ipc ridr-based implementation I was talking about last
>>>>week (see http://lkml.org/lkml/2008/4/4/208).
>>>>I couldn't avoid much of the code duplication, but at least made things
>>>>incremental.
>>>>
>>>>Does somebody now a test suite that exists for the idr API, that I could
>>>>run on this new api?
>>>>
>>>>Mike, can you try to run it on your victim: I had such a hard time building
>>>>this patch, that I couldn't re-run the test on my 8-core with this new
>>>>version. So the last results I have are for 2.6.25-rc3-mm1.
>>>>
>>>>Also, I think a careful review should be done to avoid introducing yet other
>>>>problems :-(
>>>
>>>
>>>Why duplicate the whole thing, when we converted the Radix tree to be
>>>RCU safe we did it in-place. Is there a reason this is not done for idr?
>>>
>>>
>>>
>>
>>I did that because I wanted to go fast and try to fix the performance
>>problem we have with sysV ipc's. I didn't want to introduce (yet other)
>>regressions in the code that uses idr's today and that works well ;-)
>>May be in the future if this rcu based api appears to be ok, we can
>>replace one with the other?
>
>
>>From what I can see the API doesn't change at all,
Well, 1 interface changes, 1 is added and another one went away:
1) for the preload part (it becomes like the radix-tree preload part):
int idr_pre_get(struct idr *, gfp_t);
would become
int idr_pre_get(gfp_t);
2) idr_pre_get_end() is added (same as radix_tree_preload_end()).
3) The idr_init() disappears.
You might see that other interfaces are not provided by ridr, but this
is only because I've taken those that are useful for the ipc part (so
should not be a problem to make the whole thing rcu safe).
> so I don't see why
> you need to duplicate - either the new code works as expected or its
> broken.
That's why I asked for an "IDR test suite": I wanted to test potential
regressions.
> If it works its good enough for all IDR users, if its broken we
> should fix it. Seems simple enough.. am I missing something obvious?
>
Regards,
Nadia
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-14 8:33 ` Nadia Derbey
@ 2008-04-14 10:52 ` Nadia Derbey
2008-04-14 18:54 ` Manfred Spraul
2008-04-19 23:28 ` Paul E. McKenney
2 siblings, 0 replies; 30+ messages in thread
From: Nadia Derbey @ 2008-04-14 10:52 UTC (permalink / raw)
To: Nadia Derbey
Cc: Peter Zijlstra, efault, manfred, linux-kernel, paulmck, akpm,
xemul
[-- Attachment #1: Type: text/plain, Size: 3110 bytes --]
Nadia Derbey wrote:
> Peter Zijlstra wrote:
>
>> On Mon, 2008-04-14 at 07:18 +0200, Nadia Derbey wrote:
>>
>>> Peter Zijlstra wrote:
>>>
>>>> On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
>>>>
>>>>
>>>>> Here is finally the ipc ridr-based implementation I was talking
>>>>> about last
>>>>> week (see http://lkml.org/lkml/2008/4/4/208).
>>>>> I couldn't avoid much of the code duplication, but at least made
>>>>> things
>>>>> incremental.
>>>>>
>>>>> Does somebody now a test suite that exists for the idr API, that I
>>>>> could
>>>>> run on this new api?
>>>>>
>>>>> Mike, can you try to run it on your victim: I had such a hard time
>>>>> building
>>>>> this patch, that I couldn't re-run the test on my 8-core with this new
>>>>> version. So the last results I have are for 2.6.25-rc3-mm1.
>>>>>
>>>>> Also, I think a careful review should be done to avoid introducing
>>>>> yet other
>>>>> problems :-(
>>>>
>>>>
>>>>
>>>> Why duplicate the whole thing, when we converted the Radix tree to be
>>>> RCU safe we did it in-place. Is there a reason this is not done for
>>>> idr?
>>>>
>>>>
>>>>
>>>
>>> I did that because I wanted to go fast and try to fix the performance
>>> problem we have with sysV ipc's. I didn't want to introduce (yet
>>> other) regressions in the code that uses idr's today and that works
>>> well ;-)
>>> May be in the future if this rcu based api appears to be ok, we can
>>> replace one with the other?
>>
>>
>>
>>> From what I can see the API doesn't change at all,
>
>
> Well, 1 interface changes, 1 is added and another one went away:
>
> 1) for the preload part (it becomes like the radix-tree preload part):
>
> int idr_pre_get(struct idr *, gfp_t);
> would become
> int idr_pre_get(gfp_t);
>
> 2) idr_pre_get_end() is added (same as radix_tree_preload_end()).
>
> 3) The idr_init() disappears.
>
> You might see that other interfaces are not provided by ridr, but this
> is only because I've taken those that are useful for the ipc part (so
> should not be a problem to make the whole thing rcu safe).
>
>> so I don't see why
>> you need to duplicate - either the new code works as expected or its
>> broken.
>
>
> That's why I asked for an "IDR test suite": I wanted to test potential
> regressions.
>
>> If it works its good enough for all IDR users, if its broken we
>> should fix it. Seems simple enough.. am I missing something obvious?
>>
>
> Regards,
> Nadia
>
BTW, I'm realizing that I forgot to send the results I've got - sorry
for that (I finally could pass the pmsg/psem tests this morning):
These are the output files for the command:
for i in 1 2 3 4 5 6 7 8;do ./pmsg $i 5;done
pmsg_output.25_rc8_mm1.ref.8: output file for the 2.6.25-rc8-mm1
reference kernel
pmsg_output.25_rc8_mm1.ridr.8: output file for the 2.6.25-rc8-mm1
refrence kernel, with ipc's using
rcu-based idr's
psem_output.25_rc8_mm1.ref.8: same as <1> for the psem test
psem_output.25_rc8_mm1.ridr.8: same as <2> for the psem test
Regards,
Nadia
[-- Attachment #2: results.tar.bz2 --]
[-- Type: application/x-redhat-package-manager, Size: 2623 bytes --]
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (13 preceding siblings ...)
2008-04-11 16:27 ` [PATCH 00/13] Re: Scalability requirements for sysv ipc Peter Zijlstra
@ 2008-04-14 13:54 ` Mike Galbraith
2008-04-14 15:01 ` Nadia Derbey
2008-04-19 23:24 ` Paul E. McKenney
2008-04-19 23:25 ` Paul E. McKenney
16 siblings, 1 reply; 30+ messages in thread
From: Mike Galbraith @ 2008-04-14 13:54 UTC (permalink / raw)
To: Nadia.Derbey; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul
On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
> Mike, can you try to run it on your victim: I had such a hard time building
> this patch, that I couldn't re-run the test on my 8-core with this new
> version. So the last results I have are for 2.6.25-rc3-mm1.
I wedged the patches into 2.6.25.git. 5 second psem numbers for quad.
4071994
8342256
11864126
15425507
-Mike
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-14 13:54 ` Mike Galbraith
@ 2008-04-14 15:01 ` Nadia Derbey
0 siblings, 0 replies; 30+ messages in thread
From: Nadia Derbey @ 2008-04-14 15:01 UTC (permalink / raw)
To: Mike Galbraith; +Cc: manfred, linux-kernel, paulmck, akpm, peterz, xemul
[-- Attachment #1: Type: text/plain, Size: 1032 bytes --]
Mike Galbraith wrote:
> On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
>
>
>>Mike, can you try to run it on your victim: I had such a hard time building
>>this patch, that I couldn't re-run the test on my 8-core with this new
>>version. So the last results I have are for 2.6.25-rc3-mm1.
>
>
> I wedged the patches into 2.6.25.git. 5 second psem numbers for quad.
>
> 4071994
> 8342256
> 11864126
> 15425507
>
> -Mike
>
Thanks Mike,
I'm realizing that I should also extract the "interesting information"
from the results files I've sent earlier:
2.6.25-rc8-mm1 ref kernel: Total transactions for psem during 5 secs:
Total: 1531469
Total: 1748813
Total: 2278479
Total: 1508543
Total: 429880
Total: 361650
Total: 212112
Total: 190234
2.6.25-rc8-mm1 + ridr patches: Total transactions for psem during 5 secs:
Total: 1699600
Total: 1965015
Total: 3517236
Total: 3500064
Total: 5203678
Total: 5229162
Total: 6850684
Total: 6999881
Also, attached is the cpuinfo file + the config file.
Regards,
Nadia
[-- Attachment #2: cpuinfo --]
[-- Type: text/plain, Size: 10202 bytes --]
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6009.20
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.34
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 2
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 0
siblings : 4
core id : 1
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.48
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 3
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 0
siblings : 4
core id : 1
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.47
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 4
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 9
siblings : 4
core id : 1
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.47
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 5
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 9
siblings : 4
core id : 1
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.50
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 6
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 9
siblings : 4
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.48
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 7
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 9
siblings : 4
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.50
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 8
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 4
siblings : 4
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.53
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 9
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 4
siblings : 4
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.50
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 10
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 4
siblings : 4
core id : 1
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.51
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 11
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 4
siblings : 4
core id : 1
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.51
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 12
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 13
siblings : 4
core id : 1
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.51
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 13
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 13
siblings : 4
core id : 1
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.51
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 14
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 13
siblings : 4
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.52
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 15
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 8
cpu MHz : 3002.228
cache size : 2048 KB
physical id : 13
siblings : 4
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm
bogomips : 6004.49
clflush size : 64
cache_alignment : 128
address sizes : 40 bits physical, 48 bits virtual
power management:
[-- Attachment #3: config-2.6.25-rc8-mm1 --]
[-- Type: text/plain, Size: 55375 bytes --]
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.25-rc8-mm1
# Fri Apr 11 15:35:16 2008
#
CONFIG_64BIT=y
# CONFIG_X86_32 is not set
CONFIG_X86_64=y
CONFIG_X86=y
# CONFIG_GENERIC_LOCKBREAK is not set
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_FAST_CMPXCHG_LOCAL=y
CONFIG_MMU=y
CONFIG_ZONE_DMA=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_HWEIGHT=y
# CONFIG_GENERIC_GPIO is not set
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ZONE_DMA32=y
CONFIG_ARCH_POPULATES_NODE_MAP=y
CONFIG_AUDIT_ARCH=y
CONFIG_ARCH_SUPPORTS_AOUT=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_PENDING_IRQ=y
CONFIG_X86_SMP=y
CONFIG_X86_64_SMP=y
CONFIG_X86_HT=y
CONFIG_X86_TRAMPOLINE=y
# CONFIG_KTIME_SCALAR is not set
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
#
# General setup
#
CONFIG_EXPERIMENTAL=y
CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
# CONFIG_TASKSTATS is not set
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_TREE=y
# CONFIG_IKCONFIG is not set
CONFIG_LOG_BUF_SHIFT=17
# CONFIG_CGROUPS is not set
# CONFIG_GROUP_SCHED is not set
CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y
CONFIG_RELAY=y
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y
CONFIG_EMBEDDED=y
CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
CONFIG_KALLSYMS_EXTRA_PASS=y
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_COMPAT_BRK=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_ANON_INODES=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
# CONFIG_TIMERFD is not set
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_SLAB=y
# CONFIG_SLUB is not set
# CONFIG_SLOB is not set
CONFIG_PROFILING=y
# CONFIG_MARKERS is not set
CONFIG_OPROFILE=y
CONFIG_HAVE_OPROFILE=y
CONFIG_KPROBES=y
CONFIG_KRETPROBES=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
# CONFIG_HAVE_DMA_ATTRS is not set
# CONFIG_PROC_PAGE_MONITOR is not set
CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
# CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_KMOD=y
CONFIG_STOP_MACHINE=y
CONFIG_BLOCK=y
CONFIG_BLK_DEV_IO_TRACE=y
# CONFIG_BLK_DEV_BSG is not set
CONFIG_BLOCK_COMPAT=y
#
# IO Schedulers
#
CONFIG_IOSCHED_CFQ=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_NOOP=y
CONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_AS is not set
# CONFIG_DEFAULT_DEADLINE is not set
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="cfq"
CONFIG_CLASSIC_RCU=y
#
# Processor type and features
#
# CONFIG_TICK_ONESHOT is not set
# CONFIG_NO_HZ is not set
# CONFIG_HIGH_RES_TIMERS is not set
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
CONFIG_SMP=y
CONFIG_X86_PC=y
# CONFIG_X86_ELAN is not set
# CONFIG_X86_VOYAGER is not set
# CONFIG_X86_NUMAQ is not set
# CONFIG_X86_SUMMIT is not set
# CONFIG_X86_BIGSMP is not set
# CONFIG_X86_VISWS is not set
# CONFIG_X86_GENERICARCH is not set
# CONFIG_X86_ES7000 is not set
# CONFIG_X86_RDC321X is not set
# CONFIG_X86_VSMP is not set
# CONFIG_PARAVIRT_GUEST is not set
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
# CONFIG_M686 is not set
# CONFIG_MPENTIUMII is not set
# CONFIG_MPENTIUMIII is not set
# CONFIG_MPENTIUMM is not set
# CONFIG_MPENTIUM4 is not set
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MEFFICEON is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MGEODEGX1 is not set
# CONFIG_MGEODE_LX is not set
# CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set
# CONFIG_MVIAC7 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
CONFIG_GENERIC_CPU=y
CONFIG_X86_L1_CACHE_BYTES=128
CONFIG_X86_INTERNODE_CACHE_BYTES=128
CONFIG_X86_CMPXCHG=y
CONFIG_X86_L1_CACHE_SHIFT=7
CONFIG_X86_GOOD_APIC=y
CONFIG_X86_TSC=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_HPET_TIMER=y
CONFIG_DMI=y
# CONFIG_GART_IOMMU is not set
CONFIG_CALGARY_IOMMU=y
CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
CONFIG_IOMMU_HELPER=y
CONFIG_SWIOTLB=y
CONFIG_NR_CPUS=255
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_MCE=y
CONFIG_X86_MCE_INTEL=y
CONFIG_X86_MCE_AMD=y
# CONFIG_I8K is not set
CONFIG_MICROCODE=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
CONFIG_NUMA=y
CONFIG_K8_NUMA=y
CONFIG_X86_64_ACPI_NUMA=y
CONFIG_NUMA_EMU=y
CONFIG_NODES_SHIFT=6
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_FLATMEM_MANUAL is not set
# CONFIG_DISCONTIGMEM_MANUAL is not set
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_NEED_MULTIPLE_NODES=y
CONFIG_HAVE_MEMORY_PRESENT=y
# CONFIG_SPARSEMEM_STATIC is not set
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_MIGRATION=y
CONFIG_RESOURCES_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_MTRR=y
# CONFIG_EFI is not set
# CONFIG_SECCOMP is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
# CONFIG_SCHED_HRTICK is not set
CONFIG_KEXEC=y
# CONFIG_CRASH_DUMP is not set
CONFIG_PHYSICAL_START=0x200000
# CONFIG_RELOCATABLE is not set
CONFIG_PHYSICAL_ALIGN=0x200000
CONFIG_HOTPLUG_CPU=y
CONFIG_COMPAT_VDSO=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
#
# Power management options
#
CONFIG_PM=y
# CONFIG_PM_DEBUG is not set
CONFIG_PM_SLEEP_SMP=y
CONFIG_PM_SLEEP=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
# CONFIG_HIBERNATION is not set
CONFIG_ACPI=y
CONFIG_ACPI_SLEEP=y
# CONFIG_ACPI_PROCFS is not set
CONFIG_ACPI_PROCFS_POWER=y
CONFIG_ACPI_SYSFS_POWER=y
CONFIG_ACPI_PROC_EVENT=y
CONFIG_ACPI_AC=m
CONFIG_ACPI_BATTERY=m
CONFIG_ACPI_BUTTON=m
CONFIG_ACPI_VIDEO=m
CONFIG_ACPI_FAN=y
# CONFIG_ACPI_DOCK is not set
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_HOTPLUG_CPU=y
CONFIG_ACPI_THERMAL=y
CONFIG_ACPI_NUMA=y
# CONFIG_ACPI_WMI is not set
CONFIG_ACPI_ASUS=m
CONFIG_ACPI_TOSHIBA=m
# CONFIG_ACPI_CUSTOM_DSDT is not set
CONFIG_ACPI_BLACKLIST_YEAR=0
# CONFIG_ACPI_DEBUG is not set
CONFIG_ACPI_EC=y
# CONFIG_ACPI_PCI_SLOT is not set
CONFIG_ACPI_POWER=y
CONFIG_ACPI_SYSTEM=y
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_CONTAINER=y
# CONFIG_ACPI_SBS is not set
#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
CONFIG_CPU_FREQ_DEBUG=y
CONFIG_CPU_FREQ_STAT=m
CONFIG_CPU_FREQ_STAT_DETAILS=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
#
# CPUFreq processor drivers
#
CONFIG_X86_ACPI_CPUFREQ=m
CONFIG_X86_POWERNOW_K8=y
CONFIG_X86_POWERNOW_K8_ACPI=y
CONFIG_X86_SPEEDSTEP_CENTRINO=y
# CONFIG_X86_P4_CLOCKMOD is not set
#
# shared options
#
# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
# CONFIG_X86_SPEEDSTEP_LIB is not set
# CONFIG_CPU_IDLE is not set
#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_DOMAINS=y
# CONFIG_DMAR is not set
CONFIG_PCIEPORTBUS=y
CONFIG_PCIEAER=y
# CONFIG_PCIEASPM is not set
CONFIG_ARCH_SUPPORTS_MSI=y
CONFIG_PCI_MSI=y
CONFIG_PCI_LEGACY=y
# CONFIG_PCI_DEBUG is not set
CONFIG_HT_IRQ=y
CONFIG_ISA_DMA_API=y
CONFIG_K8_NB=y
CONFIG_PCCARD=y
# CONFIG_PCMCIA_DEBUG is not set
CONFIG_PCMCIA=y
CONFIG_PCMCIA_LOAD_CIS=y
CONFIG_CARDBUS=y
#
# PC-card bridges
#
CONFIG_YENTA=y
CONFIG_YENTA_O2=y
CONFIG_YENTA_RICOH=y
CONFIG_YENTA_TI=y
CONFIG_YENTA_ENE_TUNE=y
CONFIG_YENTA_TOSHIBA=y
CONFIG_PD6729=m
CONFIG_I82092=m
CONFIG_PCCARD_NONSTATIC=y
# CONFIG_HOTPLUG_PCI is not set
#
# Executable file formats / Emulations
#
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_BINFMT_MISC=y
CONFIG_IA32_EMULATION=y
# CONFIG_IA32_AOUT is not set
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
CONFIG_SYSVIPC_COMPAT=y
#
# Networking
#
CONFIG_NET=y
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y
CONFIG_XFRM=y
CONFIG_XFRM_USER=y
# CONFIG_XFRM_SUB_POLICY is not set
# CONFIG_XFRM_MIGRATE is not set
# CONFIG_XFRM_STATISTICS is not set
CONFIG_NET_KEY=m
# CONFIG_NET_KEY_MIGRATE is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_ASK_IP_FIB_HASH=y
# CONFIG_IP_FIB_TRIE is not set
CONFIG_IP_FIB_HASH=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=y
CONFIG_NET_IPGRE=m
CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
# CONFIG_ARPD is not set
CONFIG_SYN_COOKIES=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
CONFIG_INET_IPCOMP=y
CONFIG_INET_XFRM_TUNNEL=y
CONFIG_INET_TUNNEL=y
CONFIG_INET_XFRM_MODE_TRANSPORT=y
CONFIG_INET_XFRM_MODE_TUNNEL=y
CONFIG_INET_XFRM_MODE_BEET=y
# CONFIG_INET_LRO is not set
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_BIC=y
CONFIG_TCP_CONG_CUBIC=m
CONFIG_TCP_CONG_WESTWOOD=m
CONFIG_TCP_CONG_HTCP=m
CONFIG_TCP_CONG_HSTCP=m
CONFIG_TCP_CONG_HYBLA=m
CONFIG_TCP_CONG_VEGAS=m
CONFIG_TCP_CONG_SCALABLE=m
# CONFIG_TCP_CONG_LP is not set
# CONFIG_TCP_CONG_VENO is not set
# CONFIG_TCP_CONG_YEAH is not set
# CONFIG_TCP_CONG_ILLINOIS is not set
CONFIG_DEFAULT_BIC=y
# CONFIG_DEFAULT_CUBIC is not set
# CONFIG_DEFAULT_HTCP is not set
# CONFIG_DEFAULT_VEGAS is not set
# CONFIG_DEFAULT_WESTWOOD is not set
# CONFIG_DEFAULT_RENO is not set
CONFIG_DEFAULT_TCP_CONG="bic"
# CONFIG_TCP_MD5SIG is not set
CONFIG_IP_VS=m
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IPV6=y
CONFIG_IPV6_PRIVACY=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
# CONFIG_IPV6_OPTIMISTIC_DAD is not set
CONFIG_INET6_AH=y
CONFIG_INET6_ESP=y
CONFIG_INET6_IPCOMP=y
# CONFIG_IPV6_MIP6 is not set
CONFIG_INET6_XFRM_TUNNEL=y
CONFIG_INET6_TUNNEL=y
CONFIG_INET6_XFRM_MODE_TRANSPORT=y
CONFIG_INET6_XFRM_MODE_TUNNEL=y
CONFIG_INET6_XFRM_MODE_BEET=y
# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
CONFIG_IPV6_SIT=y
CONFIG_IPV6_TUNNEL=y
# CONFIG_IPV6_MULTIPLE_TABLES is not set
# CONFIG_NETLABEL is not set
CONFIG_NETWORK_SECMARK=y
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
# CONFIG_NETFILTER_ADVANCED is not set
#
# Core Netfilter Configuration
#
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_LOG=m
# CONFIG_NF_CONNTRACK is not set
CONFIG_NETFILTER_XTABLES=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set
# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
#
# IP: Netfilter Configuration
#
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_MANGLE=m
#
# IPv6: Netfilter Configuration
#
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_LOG=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP_DCCP=m
CONFIG_INET_DCCP_DIAG=m
CONFIG_IP_DCCP_ACKVEC=y
#
# DCCP CCIDs Configuration (EXPERIMENTAL)
#
CONFIG_IP_DCCP_CCID2=m
# CONFIG_IP_DCCP_CCID2_DEBUG is not set
CONFIG_IP_DCCP_CCID3=m
# CONFIG_IP_DCCP_CCID3_DEBUG is not set
CONFIG_IP_DCCP_CCID3_RTO=100
CONFIG_IP_DCCP_TFRC_LIB=m
#
# DCCP Kernel Hacking
#
# CONFIG_IP_DCCP_DEBUG is not set
# CONFIG_NET_DCCPPROBE is not set
CONFIG_IP_SCTP=m
# CONFIG_SCTP_DBG_MSG is not set
# CONFIG_SCTP_DBG_OBJCNT is not set
# CONFIG_SCTP_HMAC_NONE is not set
# CONFIG_SCTP_HMAC_SHA1 is not set
CONFIG_SCTP_HMAC_MD5=y
CONFIG_TIPC=m
# CONFIG_TIPC_ADVANCED is not set
# CONFIG_TIPC_DEBUG is not set
CONFIG_ATM=y
CONFIG_ATM_CLIP=y
# CONFIG_ATM_CLIP_NO_ICMP is not set
# CONFIG_ATM_LANE is not set
# CONFIG_ATM_BR2684 is not set
CONFIG_BRIDGE=y
CONFIG_VLAN_8021Q=y
# CONFIG_DECNET is not set
CONFIG_LLC=y
# CONFIG_LLC2 is not set
CONFIG_IPX=y
# CONFIG_IPX_INTERN is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_ECONET is not set
CONFIG_WAN_ROUTER=y
CONFIG_NET_SCHED=y
#
# Queueing/Scheduling
#
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_ATM=m
CONFIG_NET_SCH_PRIO=m
# CONFIG_NET_SCH_RR is not set
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_NETEM=m
CONFIG_NET_SCH_INGRESS=m
#
# Classification
#
CONFIG_NET_CLS=y
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_ROUTE=y
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_CLS_U32_PERF=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
# CONFIG_NET_CLS_FLOW is not set
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
CONFIG_NET_EMATCH_CMP=m
CONFIG_NET_EMATCH_NBYTE=m
CONFIG_NET_EMATCH_U32=m
CONFIG_NET_EMATCH_META=m
CONFIG_NET_EMATCH_TEXT=m
CONFIG_NET_CLS_ACT=y
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_GACT_PROB=y
CONFIG_NET_ACT_MIRRED=m
CONFIG_NET_ACT_IPT=m
# CONFIG_NET_ACT_NAT is not set
CONFIG_NET_ACT_PEDIT=m
CONFIG_NET_ACT_SIMP=m
CONFIG_NET_CLS_IND=y
CONFIG_NET_SCH_FIFO=y
#
# Network testing
#
CONFIG_NET_PKTGEN=m
# CONFIG_NET_TCPPROBE is not set
# CONFIG_HAMRADIO is not set
# CONFIG_CAN is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_AF_RXRPC is not set
CONFIG_FIB_RULES=y
#
# Wireless
#
# CONFIG_CFG80211 is not set
CONFIG_WIRELESS_EXT=y
# CONFIG_MAC80211 is not set
CONFIG_IEEE80211=y
# CONFIG_IEEE80211_DEBUG is not set
CONFIG_IEEE80211_CRYPT_WEP=y
CONFIG_IEEE80211_CRYPT_CCMP=y
CONFIG_IEEE80211_CRYPT_TKIP=y
# CONFIG_RFKILL is not set
# CONFIG_NET_9P is not set
#
# Device Drivers
#
#
# Generic Driver Options
#
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set
# CONFIG_SYS_HYPERVISOR is not set
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
# CONFIG_MTD is not set
CONFIG_PARPORT=m
CONFIG_PARPORT_PC=m
CONFIG_PARPORT_SERIAL=m
# CONFIG_PARPORT_PC_FIFO is not set
# CONFIG_PARPORT_PC_SUPERIO is not set
CONFIG_PARPORT_PC_PCMCIA=m
# CONFIG_PARPORT_GSC is not set
# CONFIG_PARPORT_AX88796 is not set
CONFIG_PARPORT_1284=y
CONFIG_PARPORT_NOT_PC=y
CONFIG_PNP=y
# CONFIG_PNP_DEBUG is not set
#
# Protocols
#
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_FD=m
CONFIG_PARIDE=m
#
# Parallel IDE high-level drivers
#
CONFIG_PARIDE_PD=m
CONFIG_PARIDE_PCD=m
CONFIG_PARIDE_PF=m
CONFIG_PARIDE_PT=m
CONFIG_PARIDE_PG=m
#
# Parallel IDE protocol modules
#
CONFIG_PARIDE_ATEN=m
CONFIG_PARIDE_BPCK=m
CONFIG_PARIDE_COMM=m
CONFIG_PARIDE_DSTR=m
CONFIG_PARIDE_FIT2=m
CONFIG_PARIDE_FIT3=m
CONFIG_PARIDE_EPAT=m
CONFIG_PARIDE_EPATC8=y
CONFIG_PARIDE_EPIA=m
CONFIG_PARIDE_FRIQ=m
CONFIG_PARIDE_FRPW=m
CONFIG_PARIDE_KBIC=m
CONFIG_PARIDE_KTTI=m
CONFIG_PARIDE_ON20=m
CONFIG_PARIDE_ON26=m
CONFIG_BLK_CPQ_DA=m
CONFIG_BLK_CPQ_CISS_DA=m
CONFIG_CISS_SCSI_TAPE=y
CONFIG_BLK_DEV_DAC960=m
CONFIG_BLK_DEV_UMEM=m
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_CRYPTOLOOP=m
CONFIG_BLK_DEV_NBD=m
CONFIG_BLK_DEV_SX8=m
CONFIG_BLK_DEV_UB=m
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
# CONFIG_BLK_DEV_XIP is not set
CONFIG_CDROM_PKTCDVD=m
CONFIG_CDROM_PKTCDVD_BUFFERS=8
# CONFIG_CDROM_PKTCDVD_WCACHE is not set
CONFIG_ATA_OVER_ETH=m
CONFIG_MISC_DEVICES=y
# CONFIG_IBM_ASM is not set
# CONFIG_PHANTOM is not set
CONFIG_EEPROM_93CX6=m
# CONFIG_SGI_IOC4 is not set
# CONFIG_TIFM_CORE is not set
# CONFIG_ACER_WMI is not set
# CONFIG_ASUS_LAPTOP is not set
# CONFIG_FUJITSU_LAPTOP is not set
# CONFIG_MSI_LAPTOP is not set
# CONFIG_COMPAL_LAPTOP is not set
# CONFIG_SONY_LAPTOP is not set
# CONFIG_THINKPAD_ACPI is not set
# CONFIG_INTEL_MENLOW is not set
# CONFIG_ENCLOSURE_SERVICES is not set
CONFIG_HAVE_IDE=y
CONFIG_IDE=y
CONFIG_IDE_MAX_HWIFS=4
CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_IDE_SATA is not set
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
CONFIG_BLK_DEV_IDECS=m
# CONFIG_BLK_DEV_DELKIN is not set
CONFIG_BLK_DEV_IDECD=m
# CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS is not set
# CONFIG_BLK_DEV_IDETAPE is not set
CONFIG_BLK_DEV_IDEFLOPPY=y
CONFIG_BLK_DEV_IDESCSI=m
# CONFIG_BLK_DEV_IDEACPI is not set
CONFIG_IDE_TASK_IOCTL=y
CONFIG_IDE_PROC_FS=y
#
# IDE chipset support/bugfixes
#
CONFIG_IDE_GENERIC=y
# CONFIG_BLK_DEV_PLATFORM is not set
# CONFIG_BLK_DEV_CMD640 is not set
CONFIG_BLK_DEV_IDEPNP=y
CONFIG_BLK_DEV_IDEDMA_SFF=y
#
# PCI IDE chipsets support
#
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_IDEPCI_PCIBUS_ORDER=y
# CONFIG_BLK_DEV_OFFBOARD is not set
CONFIG_BLK_DEV_GENERIC=y
# CONFIG_BLK_DEV_OPTI621 is not set
# CONFIG_BLK_DEV_RZ1000 is not set
CONFIG_BLK_DEV_IDEDMA_PCI=y
CONFIG_BLK_DEV_AEC62XX=y
CONFIG_BLK_DEV_ALI15X3=y
# CONFIG_WDC_ALI15X3 is not set
CONFIG_BLK_DEV_AMD74XX=y
CONFIG_BLK_DEV_ATIIXP=y
CONFIG_BLK_DEV_CMD64X=y
# CONFIG_BLK_DEV_TRIFLEX is not set
# CONFIG_BLK_DEV_CY82C693 is not set
# CONFIG_BLK_DEV_CS5520 is not set
# CONFIG_BLK_DEV_CS5530 is not set
CONFIG_BLK_DEV_HPT34X=y
# CONFIG_HPT34X_AUTODMA is not set
CONFIG_BLK_DEV_HPT366=y
# CONFIG_BLK_DEV_JMICRON is not set
# CONFIG_BLK_DEV_SC1200 is not set
CONFIG_BLK_DEV_PIIX=y
# CONFIG_BLK_DEV_IT8213 is not set
CONFIG_BLK_DEV_IT821X=y
# CONFIG_BLK_DEV_NS87415 is not set
CONFIG_BLK_DEV_PDC202XX_OLD=y
CONFIG_BLK_DEV_PDC202XX_NEW=y
CONFIG_BLK_DEV_SVWKS=y
CONFIG_BLK_DEV_SIIMAGE=y
CONFIG_BLK_DEV_SIS5513=y
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
CONFIG_BLK_DEV_VIA82CXXX=y
# CONFIG_BLK_DEV_TC86C001 is not set
CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_BLK_DEV_HD_ONLY is not set
# CONFIG_BLK_DEV_HD is not set
#
# SCSI device support
#
CONFIG_RAID_ATTRS=m
CONFIG_SCSI=m
CONFIG_SCSI_DMA=y
# CONFIG_SCSI_TGT is not set
CONFIG_SCSI_NETLINK=y
CONFIG_SCSI_PROC_FS=y
#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=m
CONFIG_CHR_DEV_ST=m
CONFIG_CHR_DEV_OSST=m
CONFIG_BLK_DEV_SR=m
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=m
CONFIG_CHR_DEV_SCH=m
#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
# CONFIG_SCSI_SCAN_ASYNC is not set
CONFIG_SCSI_WAIT_SCAN=m
#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=m
CONFIG_SCSI_FC_ATTRS=m
CONFIG_SCSI_ISCSI_ATTRS=m
CONFIG_SCSI_SAS_ATTRS=m
CONFIG_SCSI_SAS_LIBSAS=m
# CONFIG_SCSI_SAS_HOST_SMP is not set
CONFIG_SCSI_SAS_LIBSAS_DEBUG=y
CONFIG_SCSI_SRP_ATTRS=m
CONFIG_SCSI_LOWLEVEL=y
CONFIG_ISCSI_TCP=m
CONFIG_BLK_DEV_3W_XXXX_RAID=m
CONFIG_SCSI_3W_9XXX=m
CONFIG_SCSI_ACARD=m
CONFIG_SCSI_AACRAID=m
CONFIG_SCSI_AIC7XXX=m
CONFIG_AIC7XXX_CMDS_PER_DEVICE=4
CONFIG_AIC7XXX_RESET_DELAY_MS=15000
# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
CONFIG_AIC7XXX_DEBUG_MASK=0
# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set
CONFIG_SCSI_AIC7XXX_OLD=m
CONFIG_SCSI_AIC79XX=m
CONFIG_AIC79XX_CMDS_PER_DEVICE=4
CONFIG_AIC79XX_RESET_DELAY_MS=15000
# CONFIG_AIC79XX_DEBUG_ENABLE is not set
CONFIG_AIC79XX_DEBUG_MASK=0
# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
CONFIG_SCSI_AIC94XX=m
# CONFIG_AIC94XX_DEBUG is not set
# CONFIG_SCSI_ADVANSYS is not set
# CONFIG_SCSI_ARCMSR is not set
CONFIG_MEGARAID_NEWGEN=y
CONFIG_MEGARAID_MM=m
CONFIG_MEGARAID_MAILBOX=m
CONFIG_MEGARAID_LEGACY=m
CONFIG_MEGARAID_SAS=m
# CONFIG_SCSI_HPTIOP is not set
CONFIG_SCSI_BUSLOGIC=m
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
CONFIG_SCSI_GDTH=m
CONFIG_SCSI_IPS=m
CONFIG_SCSI_INITIO=m
CONFIG_SCSI_INIA100=m
CONFIG_SCSI_PPA=m
CONFIG_SCSI_IMM=m
# CONFIG_SCSI_IZIP_EPP16 is not set
# CONFIG_SCSI_IZIP_SLOW_CTR is not set
# CONFIG_SCSI_MVSAS is not set
# CONFIG_SCSI_STEX is not set
CONFIG_SCSI_SYM53C8XX_2=m
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
CONFIG_SCSI_SYM53C8XX_MMIO=y
CONFIG_SCSI_QLOGIC_1280=m
CONFIG_SCSI_QLA_FC=m
# CONFIG_SCSI_QLA_ISCSI is not set
CONFIG_SCSI_LPFC=m
CONFIG_SCSI_DC395x=m
CONFIG_SCSI_DC390T=m
# CONFIG_SCSI_DEBUG is not set
# CONFIG_SCSI_SRP is not set
# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
# CONFIG_ATA is not set
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
CONFIG_MD_RAID10=m
# CONFIG_MD_RAID456 is not set
CONFIG_MD_MULTIPATH=m
CONFIG_MD_FAULTY=m
CONFIG_BLK_DEV_DM=m
# CONFIG_DM_DEBUG is not set
CONFIG_DM_CRYPT=m
CONFIG_DM_SNAPSHOT=m
CONFIG_DM_MIRROR=m
CONFIG_DM_ZERO=m
CONFIG_DM_MULTIPATH=m
CONFIG_DM_MULTIPATH_EMC=m
# CONFIG_DM_MULTIPATH_RDAC is not set
# CONFIG_DM_MULTIPATH_HP is not set
# CONFIG_DM_DELAY is not set
# CONFIG_DM_UEVENT is not set
CONFIG_FUSION=y
CONFIG_FUSION_SPI=m
CONFIG_FUSION_FC=m
CONFIG_FUSION_SAS=m
CONFIG_FUSION_MAX_SGE=40
CONFIG_FUSION_CTL=m
CONFIG_FUSION_LAN=m
# CONFIG_FUSION_LOGGING is not set
#
# IEEE 1394 (FireWire) support
#
# CONFIG_FIREWIRE is not set
CONFIG_IEEE1394=m
#
# Subsystem Options
#
# CONFIG_IEEE1394_VERBOSEDEBUG is not set
#
# Controllers
#
CONFIG_IEEE1394_PCILYNX=m
CONFIG_IEEE1394_OHCI1394=m
#
# Protocols
#
CONFIG_IEEE1394_VIDEO1394=m
CONFIG_IEEE1394_SBP2=m
# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
CONFIG_IEEE1394_ETH1394_ROM_ENTRY=y
CONFIG_IEEE1394_ETH1394=m
CONFIG_IEEE1394_DV1394=m
CONFIG_IEEE1394_RAWIO=m
CONFIG_I2O=m
# CONFIG_I2O_LCT_NOTIFY_ON_CHANGES is not set
CONFIG_I2O_EXT_ADAPTEC=y
CONFIG_I2O_EXT_ADAPTEC_DMA64=y
CONFIG_I2O_CONFIG=m
CONFIG_I2O_CONFIG_OLD_IOCTL=y
CONFIG_I2O_BUS=m
CONFIG_I2O_BLOCK=m
CONFIG_I2O_SCSI=m
CONFIG_I2O_PROC=m
# CONFIG_MACINTOSH_DRIVERS is not set
CONFIG_NETDEVICES=y
# CONFIG_NETDEVICES_MULTIQUEUE is not set
CONFIG_IFB=m
CONFIG_DUMMY=m
CONFIG_BONDING=m
# CONFIG_MACVLAN is not set
CONFIG_EQUALIZER=m
CONFIG_TUN=m
# CONFIG_VETH is not set
CONFIG_NET_SB1000=m
# CONFIG_ARCNET is not set
CONFIG_PHYLIB=m
#
# MII PHY device drivers
#
CONFIG_MARVELL_PHY=m
CONFIG_DAVICOM_PHY=m
CONFIG_QSEMI_PHY=m
CONFIG_LXT_PHY=m
CONFIG_CICADA_PHY=m
# CONFIG_VITESSE_PHY is not set
# CONFIG_SMSC_PHY is not set
# CONFIG_BROADCOM_PHY is not set
# CONFIG_ICPLUS_PHY is not set
# CONFIG_REALTEK_PHY is not set
# CONFIG_MDIO_BITBANG is not set
CONFIG_NET_ETHERNET=y
CONFIG_MII=m
CONFIG_HAPPYMEAL=m
CONFIG_SUNGEM=m
CONFIG_CASSINI=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_VORTEX=m
CONFIG_TYPHOON=m
CONFIG_NET_TULIP=y
CONFIG_DE2104X=m
CONFIG_TULIP=m
# CONFIG_TULIP_MWI is not set
CONFIG_TULIP_MMIO=y
# CONFIG_TULIP_NAPI is not set
CONFIG_DE4X5=m
CONFIG_WINBOND_840=m
CONFIG_DM9102=m
CONFIG_ULI526X=m
CONFIG_PCMCIA_XIRCOM=m
# CONFIG_HP100 is not set
# CONFIG_IBM_NEW_EMAC_ZMII is not set
# CONFIG_IBM_NEW_EMAC_RGMII is not set
# CONFIG_IBM_NEW_EMAC_TAH is not set
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
CONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
CONFIG_AMD8111_ETH=m
CONFIG_AMD8111E_NAPI=y
CONFIG_ADAPTEC_STARFIRE=m
CONFIG_ADAPTEC_STARFIRE_NAPI=y
CONFIG_B44=m
CONFIG_B44_PCI_AUTOSELECT=y
CONFIG_B44_PCICORE_AUTOSELECT=y
CONFIG_B44_PCI=y
CONFIG_FORCEDETH=m
# CONFIG_FORCEDETH_NAPI is not set
# CONFIG_EEPRO100 is not set
CONFIG_E100=m
CONFIG_FEALNX=m
CONFIG_NATSEMI=m
CONFIG_NE2K_PCI=m
CONFIG_8139CP=m
CONFIG_8139TOO=m
# CONFIG_8139TOO_PIO is not set
# CONFIG_8139TOO_TUNE_TWISTER is not set
CONFIG_8139TOO_8129=y
# CONFIG_8139_OLD_RX_RESET is not set
# CONFIG_R6040 is not set
CONFIG_SIS900=m
CONFIG_EPIC100=m
CONFIG_SUNDANCE=m
# CONFIG_SUNDANCE_MMIO is not set
CONFIG_VIA_RHINE=m
CONFIG_VIA_RHINE_MMIO=y
# CONFIG_VIA_RHINE_NAPI is not set
# CONFIG_SC92031 is not set
CONFIG_NET_POCKET=y
CONFIG_ATP=m
CONFIG_DE600=m
CONFIG_DE620=m
CONFIG_NETDEV_1000=y
CONFIG_ACENIC=m
# CONFIG_ACENIC_OMIT_TIGON_I is not set
CONFIG_DL2K=m
CONFIG_E1000=m
CONFIG_E1000_NAPI=y
# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
# CONFIG_E1000E is not set
# CONFIG_E1000E_ENABLED is not set
# CONFIG_IP1000 is not set
# CONFIG_IGB is not set
CONFIG_NS83820=m
CONFIG_HAMACHI=m
CONFIG_YELLOWFIN=m
CONFIG_R8169=m
CONFIG_R8169_NAPI=y
CONFIG_R8169_VLAN=y
CONFIG_SIS190=m
CONFIG_SKGE=m
# CONFIG_SKGE_DEBUG is not set
CONFIG_SKY2=m
# CONFIG_SKY2_DEBUG is not set
CONFIG_VIA_VELOCITY=m
CONFIG_TIGON3=m
CONFIG_BNX2=m
# CONFIG_QLA3XXX is not set
# CONFIG_ATL1 is not set
CONFIG_NETDEV_10000=y
CONFIG_CHELSIO_T1=m
# CONFIG_CHELSIO_T1_1G is not set
CONFIG_CHELSIO_T1_NAPI=y
# CONFIG_CHELSIO_T3 is not set
# CONFIG_IXGBE is not set
CONFIG_IXGB=m
CONFIG_IXGB_NAPI=y
CONFIG_S2IO=m
CONFIG_S2IO_NAPI=y
# CONFIG_MYRI10GE is not set
# CONFIG_NETXEN_NIC is not set
# CONFIG_NIU is not set
# CONFIG_MLX4_CORE is not set
# CONFIG_TEHUTI is not set
# CONFIG_BNX2X is not set
CONFIG_TR=y
CONFIG_IBMOL=m
CONFIG_3C359=m
# CONFIG_TMS380TR is not set
#
# Wireless LAN
#
# CONFIG_WLAN_PRE80211 is not set
# CONFIG_WLAN_80211 is not set
#
# USB Network Adapters
#
CONFIG_USB_CATC=m
CONFIG_USB_KAWETH=m
CONFIG_USB_PEGASUS=m
CONFIG_USB_RTL8150=m
CONFIG_USB_USBNET=m
CONFIG_USB_NET_AX8817X=m
CONFIG_USB_NET_CDCETHER=m
# CONFIG_USB_NET_DM9601 is not set
CONFIG_USB_NET_GL620A=m
CONFIG_USB_NET_NET1080=m
CONFIG_USB_NET_PLUSB=m
# CONFIG_USB_NET_MCS7830 is not set
CONFIG_USB_NET_RNDIS_HOST=m
CONFIG_USB_NET_CDC_SUBSET=m
CONFIG_USB_ALI_M5632=y
CONFIG_USB_AN2720=y
CONFIG_USB_BELKIN=y
CONFIG_USB_ARMLINUX=y
CONFIG_USB_EPSON2888=y
# CONFIG_USB_KC2190 is not set
CONFIG_USB_NET_ZAURUS=m
CONFIG_NET_PCMCIA=y
CONFIG_PCMCIA_3C589=m
CONFIG_PCMCIA_3C574=m
CONFIG_PCMCIA_FMVJ18X=m
CONFIG_PCMCIA_PCNET=m
CONFIG_PCMCIA_NMCLAN=m
CONFIG_PCMCIA_SMC91C92=m
CONFIG_PCMCIA_XIRC2PS=m
CONFIG_PCMCIA_AXNET=m
# CONFIG_WAN is not set
CONFIG_ATM_DRIVERS=y
# CONFIG_ATM_DUMMY is not set
CONFIG_ATM_TCP=m
CONFIG_ATM_LANAI=m
CONFIG_ATM_ENI=m
# CONFIG_ATM_ENI_DEBUG is not set
# CONFIG_ATM_ENI_TUNE_BURST is not set
CONFIG_ATM_FIRESTREAM=m
# CONFIG_ATM_ZATM is not set
CONFIG_ATM_IDT77252=m
# CONFIG_ATM_IDT77252_DEBUG is not set
# CONFIG_ATM_IDT77252_RCV_ALL is not set
CONFIG_ATM_IDT77252_USE_SUNI=y
CONFIG_ATM_AMBASSADOR=m
# CONFIG_ATM_AMBASSADOR_DEBUG is not set
CONFIG_ATM_HORIZON=m
# CONFIG_ATM_HORIZON_DEBUG is not set
CONFIG_ATM_FORE200E_MAYBE=m
# CONFIG_ATM_FORE200E_PCA is not set
CONFIG_ATM_HE=m
# CONFIG_ATM_HE_USE_SUNI is not set
CONFIG_FDDI=y
# CONFIG_DEFXX is not set
CONFIG_SKFP=m
# CONFIG_HIPPI is not set
CONFIG_PLIP=m
CONFIG_PPP=m
CONFIG_PPP_MULTILINK=y
CONFIG_PPP_FILTER=y
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_PPP_DEFLATE=m
# CONFIG_PPP_BSDCOMP is not set
CONFIG_PPP_MPPE=m
CONFIG_PPPOE=m
CONFIG_PPPOATM=m
# CONFIG_PPPOL2TP is not set
CONFIG_SLIP=m
CONFIG_SLIP_COMPRESSED=y
CONFIG_SLHC=m
CONFIG_SLIP_SMART=y
# CONFIG_SLIP_MODE_SLIP6 is not set
CONFIG_NET_FC=y
CONFIG_NETCONSOLE=m
# CONFIG_NETCONSOLE_DYNAMIC is not set
CONFIG_NETPOLL=y
CONFIG_NETPOLL_TRAP=y
CONFIG_NET_POLL_CONTROLLER=y
# CONFIG_ISDN is not set
# CONFIG_PHONE is not set
#
# Input device support
#
CONFIG_INPUT=y
CONFIG_INPUT_FF_MEMLESS=y
CONFIG_INPUT_POLLDEV=m
#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set
#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_STOWAWAY is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
# CONFIG_MOUSE_PS2_ELANTECH is not set
CONFIG_MOUSE_SERIAL=m
# CONFIG_MOUSE_APPLETOUCH is not set
CONFIG_MOUSE_VSXXXAA=m
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TABLET is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set
#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PARKBD is not set
# CONFIG_SERIO_PCIPS2 is not set
CONFIG_SERIO_LIBPS2=y
CONFIG_SERIO_RAW=m
# CONFIG_GAMEPORT is not set
#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
CONFIG_DEVKMEM=y
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_COMPUTONE is not set
# CONFIG_ROCKETPORT is not set
CONFIG_CYCLADES=m
# CONFIG_CYZ_INTR is not set
# CONFIG_DIGIEPCA is not set
# CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set
# CONFIG_ISI is not set
CONFIG_SYNCLINK=m
CONFIG_SYNCLINKMP=m
CONFIG_SYNCLINK_GT=m
CONFIG_N_HDLC=m
# CONFIG_RISCOM8 is not set
# CONFIG_SPECIALIX is not set
# CONFIG_SX is not set
# CONFIG_RIO is not set
# CONFIG_STALDRV is not set
# CONFIG_NOZOMI is not set
#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_PNP=y
CONFIG_SERIAL_8250_CS=m
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_DETECT_IRQ=y
CONFIG_SERIAL_8250_RSA=y
#
# Non-8250 serial port support
#
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_SERIAL_JSM=m
CONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_PRINTER=m
CONFIG_LP_CONSOLE=y
CONFIG_PPDEV=m
CONFIG_IPMI_HANDLER=m
# CONFIG_IPMI_PANIC_EVENT is not set
CONFIG_IPMI_DEVICE_INTERFACE=m
CONFIG_IPMI_SI=m
CONFIG_IPMI_WATCHDOG=m
CONFIG_IPMI_POWEROFF=m
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_INTEL=y
CONFIG_HW_RANDOM_AMD=y
CONFIG_NVRAM=y
CONFIG_R3964=m
# CONFIG_APPLICOM is not set
#
# PCMCIA character devices
#
# CONFIG_SYNCLINK_CS is not set
CONFIG_CARDMAN_4000=m
CONFIG_CARDMAN_4040=m
# CONFIG_IPWIRELESS is not set
CONFIG_MWAVE=m
# CONFIG_PC8736x_GPIO is not set
# CONFIG_RAW_DRIVER is not set
CONFIG_HPET=y
# CONFIG_HPET_RTC_IRQ is not set
# CONFIG_HPET_MMAP is not set
CONFIG_HANGCHECK_TIMER=m
CONFIG_TCG_TPM=m
# CONFIG_TCG_TIS is not set
CONFIG_TCG_NSC=m
CONFIG_TCG_ATMEL=m
CONFIG_TCG_INFINEON=m
# CONFIG_TELCLOCK is not set
CONFIG_DEVPORT=y
CONFIG_I2C=m
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_CHARDEV=m
CONFIG_I2C_ALGOBIT=m
#
# I2C Hardware Bus support
#
# CONFIG_I2C_ALI1535 is not set
# CONFIG_I2C_ALI1563 is not set
# CONFIG_I2C_ALI15X3 is not set
CONFIG_I2C_AMD756=m
CONFIG_I2C_AMD756_S4882=m
CONFIG_I2C_AMD8111=m
CONFIG_I2C_I801=m
# CONFIG_I2C_I810 is not set
# CONFIG_I2C_PIIX4 is not set
CONFIG_I2C_NFORCE2=m
# CONFIG_I2C_OCORES is not set
CONFIG_I2C_PARPORT=m
CONFIG_I2C_PARPORT_LIGHT=m
CONFIG_I2C_PROSAVAGE=m
CONFIG_I2C_SAVAGE4=m
# CONFIG_I2C_SIMTEC is not set
# CONFIG_I2C_SIS5595 is not set
# CONFIG_I2C_SIS630 is not set
CONFIG_I2C_SIS96X=m
# CONFIG_I2C_TAOS_EVM is not set
CONFIG_I2C_STUB=m
# CONFIG_I2C_TINY_USB is not set
CONFIG_I2C_VIA=m
CONFIG_I2C_VIAPRO=m
CONFIG_I2C_VOODOO3=m
# CONFIG_I2C_PCA_PLATFORM is not set
#
# Miscellaneous I2C Chip support
#
# CONFIG_DS1682 is not set
CONFIG_SENSORS_EEPROM=m
CONFIG_SENSORS_PCF8574=m
# CONFIG_PCF8575 is not set
CONFIG_SENSORS_PCF8591=m
# CONFIG_TPS65010 is not set
CONFIG_SENSORS_MAX6875=m
# CONFIG_SENSORS_TSL2550 is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_I2C_DEBUG_CHIP is not set
# CONFIG_SPI is not set
#
# PPS support
#
# CONFIG_PPS is not set
CONFIG_W1=m
CONFIG_W1_CON=y
#
# 1-wire Bus Masters
#
CONFIG_W1_MASTER_MATROX=m
# CONFIG_W1_MASTER_DS2490 is not set
CONFIG_W1_MASTER_DS2482=m
#
# 1-wire Slaves
#
CONFIG_W1_SLAVE_THERM=m
CONFIG_W1_SLAVE_SMEM=m
CONFIG_W1_SLAVE_DS2433=m
# CONFIG_W1_SLAVE_DS2433_CRC is not set
# CONFIG_W1_SLAVE_DS2760 is not set
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
# CONFIG_PDA_POWER is not set
# CONFIG_BATTERY_DS2760 is not set
CONFIG_HWMON=m
CONFIG_HWMON_VID=m
# CONFIG_SENSORS_ABITUGURU is not set
# CONFIG_SENSORS_ABITUGURU3 is not set
# CONFIG_SENSORS_AD7418 is not set
CONFIG_SENSORS_ADM1021=m
CONFIG_SENSORS_ADM1025=m
CONFIG_SENSORS_ADM1026=m
# CONFIG_SENSORS_ADM1029 is not set
CONFIG_SENSORS_ADM1031=m
CONFIG_SENSORS_ADM9240=m
# CONFIG_SENSORS_ADT7470 is not set
# CONFIG_SENSORS_ADT7473 is not set
# CONFIG_SENSORS_K8TEMP is not set
CONFIG_SENSORS_ASB100=m
CONFIG_SENSORS_ATXP1=m
CONFIG_SENSORS_DS1621=m
# CONFIG_SENSORS_I5K_AMB is not set
CONFIG_SENSORS_F71805F=m
# CONFIG_SENSORS_F71882FG is not set
# CONFIG_SENSORS_F75375S is not set
CONFIG_SENSORS_FSCHER=m
CONFIG_SENSORS_FSCPOS=m
# CONFIG_SENSORS_FSCHMD is not set
CONFIG_SENSORS_GL518SM=m
CONFIG_SENSORS_GL520SM=m
# CONFIG_SENSORS_CORETEMP is not set
# CONFIG_SENSORS_IBMPEX is not set
CONFIG_SENSORS_IT87=m
CONFIG_SENSORS_LM63=m
CONFIG_SENSORS_LM75=m
CONFIG_SENSORS_LM77=m
CONFIG_SENSORS_LM78=m
CONFIG_SENSORS_LM80=m
CONFIG_SENSORS_LM83=m
CONFIG_SENSORS_LM85=m
CONFIG_SENSORS_LM87=m
CONFIG_SENSORS_LM90=m
CONFIG_SENSORS_LM92=m
# CONFIG_SENSORS_LM93 is not set
CONFIG_SENSORS_MAX1619=m
# CONFIG_SENSORS_MAX6650 is not set
CONFIG_SENSORS_PC87360=m
# CONFIG_SENSORS_PC87427 is not set
CONFIG_SENSORS_SIS5595=m
# CONFIG_SENSORS_DME1737 is not set
CONFIG_SENSORS_SMSC47M1=m
# CONFIG_SENSORS_SMSC47M192 is not set
CONFIG_SENSORS_SMSC47B397=m
# CONFIG_SENSORS_ADS7828 is not set
# CONFIG_SENSORS_THMC50 is not set
CONFIG_SENSORS_VIA686A=m
# CONFIG_SENSORS_VT1211 is not set
CONFIG_SENSORS_VT8231=m
CONFIG_SENSORS_W83781D=m
# CONFIG_SENSORS_W83791D is not set
CONFIG_SENSORS_W83792D=m
# CONFIG_SENSORS_W83793 is not set
CONFIG_SENSORS_W83L785TS=m
# CONFIG_SENSORS_W83L786NG is not set
CONFIG_SENSORS_W83627HF=m
CONFIG_SENSORS_W83627EHF=m
CONFIG_SENSORS_HDAPS=m
# CONFIG_SENSORS_APPLESMC is not set
# CONFIG_HWMON_DEBUG_CHIP is not set
CONFIG_THERMAL=y
CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_NOWAYOUT is not set
# CONFIG_WATCHDOG_CORE is not set
#
# Watchdog Device Drivers
#
CONFIG_SOFT_WATCHDOG=m
# CONFIG_ACQUIRE_WDT is not set
# CONFIG_ADVANTECH_WDT is not set
CONFIG_ALIM1535_WDT=m
CONFIG_ALIM7101_WDT=m
# CONFIG_SC520_WDT is not set
# CONFIG_EUROTECH_WDT is not set
# CONFIG_IB700_WDT is not set
CONFIG_IBMASR=m
# CONFIG_WAFER_WDT is not set
CONFIG_I6300ESB_WDT=m
# CONFIG_ITCO_WDT is not set
# CONFIG_IT8712F_WDT is not set
# CONFIG_HP_WATCHDOG is not set
# CONFIG_SC1200_WDT is not set
# CONFIG_PC87413_WDT is not set
# CONFIG_60XX_WDT is not set
# CONFIG_SBC8360_WDT is not set
# CONFIG_CPU5_WDT is not set
# CONFIG_SMSC37B787_WDT is not set
CONFIG_W83627HF_WDT=m
# CONFIG_W83697HF_WDT is not set
CONFIG_W83877F_WDT=m
CONFIG_W83977F_WDT=m
CONFIG_MACHZ_WDT=m
# CONFIG_SBC_EPX_C3_WATCHDOG is not set
#
# PCI-based Watchdog Cards
#
CONFIG_PCIPCWATCHDOG=m
CONFIG_WDTPCI=m
CONFIG_WDT_501_PCI=y
#
# USB-based Watchdog Cards
#
CONFIG_USBPCWATCHDOG=m
#
# Sonics Silicon Backplane
#
CONFIG_SSB_POSSIBLE=y
CONFIG_SSB=m
CONFIG_SSB_SPROM=y
CONFIG_SSB_PCIHOST_POSSIBLE=y
CONFIG_SSB_PCIHOST=y
# CONFIG_SSB_B43_PCI_BRIDGE is not set
CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
# CONFIG_SSB_PCMCIAHOST is not set
# CONFIG_SSB_SILENT is not set
# CONFIG_SSB_DEBUG is not set
CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
CONFIG_SSB_DRIVER_PCICORE=y
#
# Multifunction device drivers
#
# CONFIG_MFD_SM501 is not set
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
# CONFIG_DVB_CORE is not set
# CONFIG_DAB is not set
#
# Graphics support
#
CONFIG_AGP=y
CONFIG_AGP_AMD64=y
CONFIG_AGP_INTEL=y
# CONFIG_AGP_SIS is not set
CONFIG_AGP_VIA=y
CONFIG_DRM=m
CONFIG_DRM_TDFX=m
CONFIG_DRM_R128=m
CONFIG_DRM_RADEON=m
CONFIG_DRM_I810=m
CONFIG_DRM_I830=m
CONFIG_DRM_I915=m
CONFIG_DRM_MGA=m
CONFIG_DRM_SIS=m
CONFIG_DRM_VIA=m
CONFIG_DRM_SAVAGE=m
CONFIG_VGASTATE=m
CONFIG_VIDEO_OUTPUT_CONTROL=m
CONFIG_FB=y
# CONFIG_FIRMWARE_EDID is not set
CONFIG_FB_DDC=m
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
# CONFIG_FB_SYS_FILLRECT is not set
# CONFIG_FB_SYS_COPYAREA is not set
# CONFIG_FB_SYS_IMAGEBLIT is not set
# CONFIG_FB_FOREIGN_ENDIAN is not set
# CONFIG_FB_SYS_FOPS is not set
CONFIG_FB_DEFERRED_IO=y
# CONFIG_FB_SVGALIB is not set
# CONFIG_FB_MACMODES is not set
CONFIG_FB_BACKLIGHT=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y
#
# Frame buffer hardware drivers
#
CONFIG_FB_CIRRUS=m
# CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ARC is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
CONFIG_FB_VGA16=m
# CONFIG_FB_UVESA is not set
CONFIG_FB_VESA=y
# CONFIG_FB_EFI is not set
# CONFIG_FB_HECUBA is not set
# CONFIG_FB_HGA is not set
# CONFIG_FB_S1D13XXX is not set
CONFIG_FB_NVIDIA=m
CONFIG_FB_NVIDIA_I2C=y
# CONFIG_FB_NVIDIA_DEBUG is not set
CONFIG_FB_NVIDIA_BACKLIGHT=y
CONFIG_FB_RIVA=m
# CONFIG_FB_RIVA_I2C is not set
# CONFIG_FB_RIVA_DEBUG is not set
CONFIG_FB_RIVA_BACKLIGHT=y
# CONFIG_FB_LE80578 is not set
# CONFIG_FB_INTEL is not set
CONFIG_FB_MATROX=m
CONFIG_FB_MATROX_MILLENIUM=y
CONFIG_FB_MATROX_MYSTIQUE=y
CONFIG_FB_MATROX_G=y
CONFIG_FB_MATROX_I2C=m
CONFIG_FB_MATROX_MAVEN=m
CONFIG_FB_MATROX_MULTIHEAD=y
CONFIG_FB_RADEON=m
CONFIG_FB_RADEON_I2C=y
CONFIG_FB_RADEON_BACKLIGHT=y
# CONFIG_FB_RADEON_DEBUG is not set
CONFIG_FB_ATY128=m
CONFIG_FB_ATY128_BACKLIGHT=y
CONFIG_FB_ATY=m
CONFIG_FB_ATY_CT=y
CONFIG_FB_ATY_GENERIC_LCD=y
CONFIG_FB_ATY_GX=y
CONFIG_FB_ATY_BACKLIGHT=y
# CONFIG_FB_S3 is not set
CONFIG_FB_SAVAGE=m
CONFIG_FB_SAVAGE_I2C=y
CONFIG_FB_SAVAGE_ACCEL=y
# CONFIG_FB_SIS is not set
CONFIG_FB_NEOMAGIC=m
CONFIG_FB_KYRO=m
CONFIG_FB_3DFX=m
CONFIG_FB_3DFX_ACCEL=y
CONFIG_FB_VOODOO1=m
# CONFIG_FB_VT8623 is not set
CONFIG_FB_TRIDENT=m
CONFIG_FB_TRIDENT_ACCEL=y
# CONFIG_FB_ARK is not set
# CONFIG_FB_PM3 is not set
# CONFIG_FB_GEODE is not set
# CONFIG_FB_VIRTUAL is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=m
CONFIG_BACKLIGHT_CLASS_DEVICE=y
# CONFIG_BACKLIGHT_CORGI is not set
# CONFIG_BACKLIGHT_PROGEAR is not set
#
# Display device support
#
# CONFIG_DISPLAY_SUPPORT is not set
#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
CONFIG_VGACON_SOFT_SCROLLBACK=y
CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
CONFIG_VIDEO_SELECT=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_MONO is not set
# CONFIG_LOGO_LINUX_VGA16 is not set
CONFIG_LOGO_LINUX_CLUT224=y
#
# Sound
#
# CONFIG_SOUND is not set
CONFIG_HID_SUPPORT=y
CONFIG_HID=y
CONFIG_HID_DEBUG=y
# CONFIG_HIDRAW is not set
#
# USB Input Devices
#
CONFIG_USB_HID=y
# CONFIG_USB_HIDINPUT_POWERBOOK is not set
CONFIG_HID_FF=y
CONFIG_HID_PID=y
CONFIG_LOGITECH_FF=y
# CONFIG_LOGIRUMBLEPAD2_FF is not set
# CONFIG_PANTHERLORD_FF is not set
CONFIG_THRUSTMASTER_FF=y
# CONFIG_ZEROPLUS_FF is not set
CONFIG_USB_HIDDEV=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set
# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
#
# Miscellaneous USB options
#
CONFIG_USB_DEVICEFS=y
CONFIG_USB_DEVICE_CLASS=y
# CONFIG_USB_DYNAMIC_MINORS is not set
# CONFIG_USB_SUSPEND is not set
# CONFIG_USB_OTG is not set
# CONFIG_USB_OTG_WHITELIST is not set
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
#
# USB Host Controller Drivers
#
CONFIG_USB_EHCI_HCD=m
CONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
CONFIG_USB_ISP116X_HCD=m
CONFIG_USB_OHCI_HCD=m
# CONFIG_USB_OHCI_HCD_SSB is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_UHCI_HCD=m
CONFIG_USB_SL811_HCD=m
CONFIG_USB_SL811_CS=m
# CONFIG_USB_R8A66597_HCD is not set
#
# USB Device Class drivers
#
CONFIG_USB_ACM=m
CONFIG_USB_PRINTER=m
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
#
#
# may also be needed; see USB_STORAGE Help for more information
#
CONFIG_USB_STORAGE=m
# CONFIG_USB_STORAGE_DEBUG is not set
CONFIG_USB_STORAGE_DATAFAB=y
CONFIG_USB_STORAGE_FREECOM=y
CONFIG_USB_STORAGE_ISD200=y
CONFIG_USB_STORAGE_DPCM=y
CONFIG_USB_STORAGE_USBAT=y
CONFIG_USB_STORAGE_SDDR09=y
CONFIG_USB_STORAGE_SDDR55=y
CONFIG_USB_STORAGE_JUMPSHOT=y
CONFIG_USB_STORAGE_ALAUDA=y
# CONFIG_USB_STORAGE_ONETOUCH is not set
# CONFIG_USB_STORAGE_KARMA is not set
# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
CONFIG_USB_LIBUSUAL=y
#
# USB Imaging devices
#
CONFIG_USB_MDC800=m
CONFIG_USB_MICROTEK=m
CONFIG_USB_MON=y
#
# USB port drivers
#
CONFIG_USB_USS720=m
CONFIG_USB_SERIAL=m
CONFIG_USB_EZUSB=y
CONFIG_USB_SERIAL_GENERIC=y
# CONFIG_USB_SERIAL_AIRCABLE is not set
CONFIG_USB_SERIAL_AIRPRIME=m
# CONFIG_USB_SERIAL_ARK3116 is not set
CONFIG_USB_SERIAL_BELKIN=m
# CONFIG_USB_SERIAL_CH341 is not set
CONFIG_USB_SERIAL_WHITEHEAT=m
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
CONFIG_USB_SERIAL_CP2101=m
CONFIG_USB_SERIAL_CYPRESS_M8=m
CONFIG_USB_SERIAL_EMPEG=m
CONFIG_USB_SERIAL_FTDI_SIO=m
CONFIG_USB_SERIAL_FUNSOFT=m
CONFIG_USB_SERIAL_VISOR=m
CONFIG_USB_SERIAL_IPAQ=m
CONFIG_USB_SERIAL_IR=m
CONFIG_USB_SERIAL_EDGEPORT=m
CONFIG_USB_SERIAL_EDGEPORT_TI=m
CONFIG_USB_SERIAL_GARMIN=m
CONFIG_USB_SERIAL_IPW=m
# CONFIG_USB_SERIAL_IUU is not set
CONFIG_USB_SERIAL_KEYSPAN_PDA=m
CONFIG_USB_SERIAL_KEYSPAN=m
CONFIG_USB_SERIAL_KEYSPAN_MPR=y
CONFIG_USB_SERIAL_KEYSPAN_USA28=y
CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
CONFIG_USB_SERIAL_KEYSPAN_USA19=y
CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
CONFIG_USB_SERIAL_KLSI=m
CONFIG_USB_SERIAL_KOBIL_SCT=m
CONFIG_USB_SERIAL_MCT_U232=m
# CONFIG_USB_SERIAL_MOS7720 is not set
# CONFIG_USB_SERIAL_MOS7840 is not set
CONFIG_USB_SERIAL_NAVMAN=m
CONFIG_USB_SERIAL_PL2303=m
# CONFIG_USB_SERIAL_OTI6858 is not set
# CONFIG_USB_SERIAL_SPCP8X5 is not set
CONFIG_USB_SERIAL_HP4X=m
CONFIG_USB_SERIAL_SAFE=m
CONFIG_USB_SERIAL_SAFE_PADDED=y
# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
CONFIG_USB_SERIAL_TI=m
CONFIG_USB_SERIAL_CYBERJACK=m
CONFIG_USB_SERIAL_XIRCOM=m
CONFIG_USB_SERIAL_OPTION=m
CONFIG_USB_SERIAL_OMNINET=m
# CONFIG_USB_SERIAL_DEBUG is not set
#
# USB Miscellaneous drivers
#
CONFIG_USB_EMI62=m
CONFIG_USB_EMI26=m
# CONFIG_USB_ADUTUX is not set
CONFIG_USB_AUERSWALD=m
CONFIG_USB_RIO500=m
CONFIG_USB_LEGOTOWER=m
CONFIG_USB_LCD=m
# CONFIG_USB_BERRY_CHARGE is not set
CONFIG_USB_LED=m
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_PHIDGET is not set
CONFIG_USB_IDMOUSE=m
# CONFIG_USB_FTDI_ELAN is not set
# CONFIG_USB_APPLEDISPLAY is not set
CONFIG_USB_SISUSBVGA=m
CONFIG_USB_SISUSBVGA_CON=y
CONFIG_USB_LD=m
# CONFIG_USB_TRANCEVIBRATOR is not set
# CONFIG_USB_IOWARRIOR is not set
CONFIG_USB_TEST=m
# CONFIG_USB_GOTEMP is not set
CONFIG_USB_ATM=m
CONFIG_USB_SPEEDTOUCH=m
CONFIG_USB_CXACRU=m
CONFIG_USB_UEAGLEATM=m
CONFIG_USB_XUSBATM=m
# CONFIG_USB_GADGET is not set
CONFIG_MMC=m
# CONFIG_MMC_DEBUG is not set
# CONFIG_MMC_UNSAFE_RESUME is not set
#
# MMC/SD Card Drivers
#
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_BOUNCE=y
# CONFIG_SDIO_UART is not set
#
# MMC/SD Host Controller Drivers
#
CONFIG_MMC_SDHCI=m
# CONFIG_MMC_RICOH_MMC is not set
CONFIG_MMC_WBSD=m
# CONFIG_MMC_TIFM_SD is not set
# CONFIG_MEMSTICK is not set
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
#
# LED drivers
#
# CONFIG_LEDS_CLEVO_MAIL is not set
#
# LED Triggers
#
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=m
CONFIG_LEDS_TRIGGER_IDE_DISK=y
# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
# CONFIG_ACCESSIBILITY is not set
CONFIG_INFINIBAND=m
CONFIG_INFINIBAND_USER_MAD=m
CONFIG_INFINIBAND_USER_ACCESS=m
CONFIG_INFINIBAND_USER_MEM=y
CONFIG_INFINIBAND_ADDR_TRANS=y
CONFIG_INFINIBAND_MTHCA=m
CONFIG_INFINIBAND_MTHCA_DEBUG=y
CONFIG_INFINIBAND_IPATH=m
# CONFIG_INFINIBAND_AMSO1100 is not set
# CONFIG_MLX4_INFINIBAND is not set
# CONFIG_INFINIBAND_NES is not set
CONFIG_INFINIBAND_IPOIB=m
# CONFIG_INFINIBAND_IPOIB_CM is not set
CONFIG_INFINIBAND_IPOIB_DEBUG=y
CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y
CONFIG_INFINIBAND_SRP=m
# CONFIG_INFINIBAND_ISER is not set
CONFIG_EDAC=y
#
# Reporting subsystems
#
# CONFIG_EDAC_DEBUG is not set
CONFIG_EDAC_MM_EDAC=m
CONFIG_EDAC_E752X=m
# CONFIG_EDAC_I82975X is not set
# CONFIG_EDAC_I3000 is not set
# CONFIG_EDAC_I5000 is not set
CONFIG_RTC_LIB=m
CONFIG_RTC_CLASS=m
#
# RTC interfaces
#
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
# CONFIG_RTC_DRV_TEST is not set
#
# I2C RTC drivers
#
# CONFIG_RTC_DRV_DS1307 is not set
# CONFIG_RTC_DRV_DS1374 is not set
CONFIG_RTC_DRV_DS1672=m
# CONFIG_RTC_DRV_MAX6900 is not set
CONFIG_RTC_DRV_RS5C372=m
# CONFIG_RTC_DRV_ISL1208 is not set
CONFIG_RTC_DRV_X1205=m
CONFIG_RTC_DRV_PCF8563=m
# CONFIG_RTC_DRV_PCF8583 is not set
# CONFIG_RTC_DRV_M41T80 is not set
# CONFIG_RTC_DRV_S35390A is not set
#
# SPI RTC drivers
#
#
# Platform RTC drivers
#
# CONFIG_RTC_DRV_CMOS is not set
# CONFIG_RTC_DRV_DS1511 is not set
# CONFIG_RTC_DRV_DS1553 is not set
# CONFIG_RTC_DRV_DS1742 is not set
# CONFIG_RTC_DRV_STK17TA8 is not set
# CONFIG_RTC_DRV_M48T86 is not set
# CONFIG_RTC_DRV_M48T59 is not set
# CONFIG_RTC_DRV_V3020 is not set
#
# on-CPU RTC drivers
#
# CONFIG_DMADEVICES is not set
# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set
#
# Firmware Drivers
#
CONFIG_EDD=y
# CONFIG_EDD_OFF is not set
# CONFIG_DELL_RBU is not set
# CONFIG_DCDBAS is not set
CONFIG_DMIID=y
# CONFIG_ISCSI_IBFT_FIND is not set
#
# File systems
#
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y
CONFIG_EXT2_FS_XIP=y
CONFIG_FS_XIP=y
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_FS_MBCACHE=y
# CONFIG_REISER4_FS is not set
CONFIG_REISERFS_FS=m
# CONFIG_REISERFS_CHECK is not set
CONFIG_REISERFS_PROC_INFO=y
CONFIG_REISERFS_FS_XATTR=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_SECURITY=y
CONFIG_JFS_FS=m
CONFIG_JFS_POSIX_ACL=y
CONFIG_JFS_SECURITY=y
# CONFIG_JFS_DEBUG is not set
# CONFIG_JFS_STATISTICS is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_XFS_FS=m
CONFIG_XFS_QUOTA=y
CONFIG_XFS_SECURITY=y
CONFIG_XFS_POSIX_ACL=y
# CONFIG_XFS_RT is not set
# CONFIG_GFS2_FS is not set
# CONFIG_OCFS2_FS is not set
CONFIG_DNOTIFY=y
CONFIG_INOTIFY=y
CONFIG_INOTIFY_USER=y
# CONFIG_QUOTA is not set
CONFIG_QUOTACTL=y
CONFIG_AUTOFS_FS=y
CONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not set
#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
CONFIG_UDF_FS=m
CONFIG_UDF_NLS=y
#
# DOS/FAT/NT Filesystems
#
# CONFIG_MSDOS_FS is not set
# CONFIG_VFAT_FS is not set
# CONFIG_NTFS_FS is not set
#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
# CONFIG_TMPFS_POSIX_ACL is not set
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_CONFIGFS_FS=y
#
# Layered filesystems
#
# CONFIG_ECRYPT_FS is not set
# CONFIG_UNION_FS is not set
#
# Miscellaneous filesystems
#
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_CRAMFS is not set
# CONFIG_VXFS_FS is not set
CONFIG_MINIX_FS=y
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
CONFIG_ROMFS_FS=y
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
# CONFIG_NETWORK_FILESYSTEMS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=y
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
CONFIG_NLS_CODEPAGE_850=y
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
CONFIG_NLS_CODEPAGE_863=y
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
CONFIG_NLS_ISO8859_15=y
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
CONFIG_NLS_UTF8=y
# CONFIG_DLM is not set
#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
# CONFIG_PRINTK_TIME is not set
CONFIG_ENABLE_WARN_DEPRECATED=y
CONFIG_ENABLE_MUST_CHECK=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_UNUSED_SYMBOLS=y
# CONFIG_PAGE_OWNER is not set
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
CONFIG_DETECT_SOFTLOCKUP=y
CONFIG_SCHED_DEBUG=y
CONFIG_SCHEDSTATS=y
# CONFIG_TIMER_STATS is not set
# CONFIG_DEBUG_OBJECTS is not set
CONFIG_DEBUG_SLAB=y
CONFIG_DEBUG_SLAB_LEAK=y
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_RT_MUTEX_TESTER is not set
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_PROVE_LOCKING is not set
# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_SPINLOCK_SLEEP=y
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_WRITECOUNT is not set
# CONFIG_DEBUG_LIST is not set
# CONFIG_DEBUG_SG is not set
CONFIG_FRAME_POINTER=y
# CONFIG_PROFILE_LIKELY is not set
# CONFIG_BOOT_PRINTK_DELAY is not set
# CONFIG_DEBUG_SYNCHRO_TEST is not set
# CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_KPROBES_SANITY_TEST is not set
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_LKDTM is not set
# CONFIG_FAULT_INJECTION is not set
# CONFIG_LATENCYTOP is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
# CONFIG_SAMPLES is not set
# CONFIG_KGDB is not set
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_EARLY_PRINTK=y
# CONFIG_DEBUG_STACKOVERFLOW is not set
# CONFIG_DEBUG_STACK_USAGE is not set
# CONFIG_DEBUG_PAGEALLOC is not set
# CONFIG_DEBUG_PER_CPU_MAPS is not set
# CONFIG_X86_PTDUMP is not set
CONFIG_DEBUG_RODATA=y
# CONFIG_DIRECT_GBPAGES is not set
# CONFIG_DEBUG_RODATA_TEST is not set
# CONFIG_DEBUG_NX_TEST is not set
CONFIG_X86_MPPARSE=y
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IO_DELAY_TYPE_NONE=3
CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not set
CONFIG_DEFAULT_IO_DELAY_TYPE=0
# CONFIG_DEBUG_BOOT_PARAMS is not set
# CONFIG_CPA_DEBUG is not set
#
# Security options
#
CONFIG_KEYS=y
CONFIG_KEYS_DEBUG_PROC_KEYS=y
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
# CONFIG_SECURITY_NETWORK_XFRM is not set
CONFIG_SECURITY_CAPABILITIES=y
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
# CONFIG_SECURITY_ROOTPLUG is not set
CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
# CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT is not set
# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
CONFIG_CRYPTO=y
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_BLKCIPHER=y
# CONFIG_CRYPTO_SEQIV is not set
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_HMAC=y
# CONFIG_CRYPTO_XCBC is not set
CONFIG_CRYPTO_NULL=y
CONFIG_CRYPTO_MD4=y
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA256=y
CONFIG_CRYPTO_SHA512=y
CONFIG_CRYPTO_WP512=y
CONFIG_CRYPTO_TGR192=y
# CONFIG_CRYPTO_GF128MUL is not set
CONFIG_CRYPTO_ECB=y
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_PCBC=m
# CONFIG_CRYPTO_LRW is not set
# CONFIG_CRYPTO_XTS is not set
# CONFIG_CRYPTO_CTR is not set
# CONFIG_CRYPTO_CTS is not set
# CONFIG_CRYPTO_GCM is not set
# CONFIG_CRYPTO_CCM is not set
# CONFIG_CRYPTO_CRYPTD is not set
CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_FCRYPT is not set
CONFIG_CRYPTO_BLOWFISH=y
CONFIG_CRYPTO_TWOFISH=y
CONFIG_CRYPTO_TWOFISH_COMMON=y
# CONFIG_CRYPTO_TWOFISH_X86_64 is not set
CONFIG_CRYPTO_SERPENT=y
CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_AES_X86_64=y
CONFIG_CRYPTO_CAST5=y
CONFIG_CRYPTO_CAST6=y
CONFIG_CRYPTO_TEA=y
CONFIG_CRYPTO_ARC4=y
CONFIG_CRYPTO_KHAZAD=y
CONFIG_CRYPTO_ANUBIS=y
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SALSA20 is not set
# CONFIG_CRYPTO_SALSA20_X86_64 is not set
CONFIG_CRYPTO_DEFLATE=y
CONFIG_CRYPTO_MICHAEL_MIC=y
CONFIG_CRYPTO_CRC32C=y
# CONFIG_CRYPTO_CAMELLIA is not set
# CONFIG_CRYPTO_TEST is not set
CONFIG_CRYPTO_AUTHENC=y
# CONFIG_CRYPTO_LZO is not set
CONFIG_CRYPTO_HW=y
# CONFIG_CRYPTO_DEV_HIFN_795X is not set
CONFIG_HAVE_KVM=y
# CONFIG_VIRTUALIZATION is not set
#
# Library routines
#
CONFIG_BITREVERSE=y
CONFIG_CRC_CCITT=y
CONFIG_CRC16=y
# CONFIG_CRC_ITU_T is not set
CONFIG_CRC32=y
# CONFIG_CRC7 is not set
CONFIG_LIBCRC32C=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m
CONFIG_PLIST=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
# CONFIG_TRACE is not set
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-14 8:33 ` Nadia Derbey
2008-04-14 10:52 ` Nadia Derbey
@ 2008-04-14 18:54 ` Manfred Spraul
2008-04-15 6:13 ` Nadia Derbey
2008-04-19 23:28 ` Paul E. McKenney
2 siblings, 1 reply; 30+ messages in thread
From: Manfred Spraul @ 2008-04-14 18:54 UTC (permalink / raw)
To: Nadia Derbey; +Cc: Peter Zijlstra, efault, linux-kernel, paulmck, akpm, xemul
Nadia Derbey wrote:
>
> Well, 1 interface changes, 1 is added and another one went away:
>
> 1) for the preload part (it becomes like the radix-tree preload part):
>
> int idr_pre_get(struct idr *, gfp_t);
> would become
> int idr_pre_get(gfp_t);
>
Btw, that's one point I didn't understand about the idr code:
Is it interrupt-safe? It uses spin_lock_irqsave and gfp_t, this implies
that it could be called from all contexts.
But the prealloc made me a bit nervous: does it handle idr_pre_get();
interrupt with another idr_pre_get(), add, pre_get_end, interrupt ends,
... correctly?
If it's only intended to be called from process context I would remove
the _irqsave and perhaps add an assert(!in_interrupt())
--
Manfred
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-14 18:54 ` Manfred Spraul
@ 2008-04-15 6:13 ` Nadia Derbey
0 siblings, 0 replies; 30+ messages in thread
From: Nadia Derbey @ 2008-04-15 6:13 UTC (permalink / raw)
To: Manfred Spraul; +Cc: Peter Zijlstra, efault, linux-kernel, paulmck, akpm, xemul
Manfred Spraul wrote:
> Nadia Derbey wrote:
>
>>
>> Well, 1 interface changes, 1 is added and another one went away:
>>
>> 1) for the preload part (it becomes like the radix-tree preload part):
>>
>> int idr_pre_get(struct idr *, gfp_t);
>> would become
>> int idr_pre_get(gfp_t);
>>
> Btw, that's one point I didn't understand about the idr code:
> Is it interrupt-safe? It uses spin_lock_irqsave and gfp_t, this implies
> that it could be called from all contexts.
>
> But the prealloc made me a bit nervous: does it handle idr_pre_get();
> interrupt with another idr_pre_get(), add, pre_get_end, interrupt ends,
> ... correctly?
I don't know if I'm answering your question, but after allocating,
idr_pre_get() calls free_layer() which is the routine that inserts the
allocated memory into the idr free list. And free_layer() calls
spin_lock_ir_save() to protect this free list modification. So it should
be safe?
>
> If it's only intended to be called from process context I would remove
> the _irqsave and perhaps add an assert(!in_interrupt())
Well, I guess it might be called from any context, since the
kmem_cache_alloc is called with the gfp_mask routine's parameter?
Regards,
Nadia
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (14 preceding siblings ...)
2008-04-14 13:54 ` Mike Galbraith
@ 2008-04-19 23:24 ` Paul E. McKenney
2008-04-19 23:25 ` Paul E. McKenney
16 siblings, 0 replies; 30+ messages in thread
From: Paul E. McKenney @ 2008-04-19 23:24 UTC (permalink / raw)
To: Nadia.Derbey; +Cc: efault, manfred, linux-kernel, akpm, peterz, xemul
On Fri, Apr 11, 2008 at 06:17:02PM +0200, Nadia.Derbey@bull.net wrote:
>
>
> Here is finally the ipc ridr-based implementation I was talking about last
> week (see http://lkml.org/lkml/2008/4/4/208).
> I couldn't avoid much of the code duplication, but at least made things
> incremental.
>
> Does somebody now a test suite that exists for the idr API, that I could
> run on this new api?
>
> Mike, can you try to run it on your victim: I had such a hard time building
> this patch, that I couldn't re-run the test on my 8-core with this new
> version. So the last results I have are for 2.6.25-rc3-mm1.
>
> Also, I think a careful review should be done to avoid introducing yet other
> problems :-(
>
> *WARNING*: this patch contains a fix for idr.c
> I know, I'm doing things bad, but I only saw the problem this
> afternoon.
>
> It should be applied on linux-2.6.25-rc8-mm1, in the following order:
>
> [ PATCH 01/13 ] : copy_idr_code.patch
> [ PATCH 02/13 ] : change_ridr_struct.patch
> [ PATCH 03/13 ] : ridr_pre_get.patch
> [ PATCH 04/13 ] : ridr_alloc_layer.patch
> [ PATCH 05/13 ] : ridr_free_layer.patch
> [ PATCH 06/13 ] : ridr_sub_alloc.patch
> [ PATCH 07/13 ] : ridr_get_empty_slot.patch
> [ PATCH 08/13 ] : ridr_get_new.patch
> [ PATCH 09/13 ] : ridr_remove.patch
> [ PATCH 10/13 ] : ridr_find.patch
> [ PATCH 11/13 ] : ridr_integrate.patch
> [ PATCH 12/13 ] : ipc_use_ridr.patch
> [ PATCH 13/13 ] : remove_ipc_lock_down.patch
Some comments on the resulting ridr.h.
Thanx, Paul
> /*
> * include/linux/ridr.h
> *
> * Small id to pointer translation service avoiding fixed sized
> * tables. RCU-based implmentation of IDRs.
> */
>
> #ifndef _RIDR_H_
> #define _RIDR_H_
>
> #include <linux/idr.h>
> #include <linux/rcupdate.h>
>
> struct ridr_layer {
> unsigned long bitmap; /* A zero bit means "space here" */
> struct ridr_layer *ary[1<<IDR_BITS];
> int count; /* When zero, we can release it */
> struct rcu_head rcu_head;
> };
Added an rcu_head for freeing.
> struct ridr {
> int layers;
> gfp_t gfp_mask;
> struct ridr_layer *top;
The id_free and id_free_cnt fields seem to have migrated to the per-CPU
ridr_pregets variable. The lock field seems to have been exported to
the caller, hence the per-CPU variables.
Other strategies include:
1. Passing the lock into the ridr_pre_get() function, allowing
it to safely update the id_free list. This gets painful given
the wide variety of locks, semaphores, mutexes, &c.
2. Having ridr_pre_get() return a reference to the memory, which
has the disadvantage of overallocation and needing to repeatedly
allocate and free.
3. Have a separate leaf lock guarding the freelist cache.
This might be a better approach, since each ridr structure
seems to require a single lock held on updates in any case.
Possible disadvantages of the current per-CPU-variable strategy include
the need to disable preemption (thus hurting real-time latency),
over-allocation on a per-CPU basis, and needlessly "spattering" free
entries across all CPUs in the (unlikely) case where there is lots
of preemption. And there doesn't appear to be a way to free the
"spattered" structures.
So I suggest a global lock for the id_free list, given that there is
another global lock held when updating the ridr structure in any case.
> };
>
> #define RIDR_INIT(mask) \
> { \
> .layers = 0, \
> .gfp_mask = (mask), \
> .top = NULL, \
> }
> #define DEFINE_RIDR(name, mask) struct ridr name = RIDR_INIT(mask)
>
> #define INIT_RIDR(name, mask) \
> do { \
> (name)->layers = 0; \
> (name)->gfp_mask = (mask); \
> (name)->top = NULL; \
> } while (0)
>
>
> /**
> * Ridr synchronization (see radix-tree.h)
> *
> * ridr_find() is able to be called locklessly, using RCU. The caller must
> * ensure calls to this function are made within rcu_read_lock() regions.
> * Other readers (lock-free or otherwise) and modifications may be running
> * concurrently.
> *
> * It is still required that the caller manage the synchronization and
> * lifetimes of the items. So if RCU lock-free lookups are used, typically
> * this would mean that the items have their own locks, or are amenable to
> * lock-free access; and that the items are freed by RCU (or only freed after
> * having been deleted from the ridr tree *and* a synchronize_rcu() grace
> * period).
> */
>
> /*
> * This is what we export.
> */
>
> void *ridr_find(struct ridr *idp, int id);
> int ridr_pre_get(gfp_t gfp_mask);
> int ridr_get_new(struct ridr *idp, void *ptr, int *id);
> void ridr_remove(struct ridr *idp, int id);
>
> void __init ridr_init_cache(void);
>
> static inline void ridr_pre_get_end(void)
> {
> preempt_enable();
> }
>
> #endif /* _RIDR_H_ */
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
` (15 preceding siblings ...)
2008-04-19 23:24 ` Paul E. McKenney
@ 2008-04-19 23:25 ` Paul E. McKenney
2008-04-21 5:59 ` Nadia Derbey
2008-04-29 14:35 ` Nadia Derbey
16 siblings, 2 replies; 30+ messages in thread
From: Paul E. McKenney @ 2008-04-19 23:25 UTC (permalink / raw)
To: Nadia.Derbey; +Cc: efault, manfred, linux-kernel, akpm, peterz, xemul
On Fri, Apr 11, 2008 at 06:17:02PM +0200, Nadia.Derbey@bull.net wrote:
>
>
> Here is finally the ipc ridr-based implementation I was talking about last
> week (see http://lkml.org/lkml/2008/4/4/208).
> I couldn't avoid much of the code duplication, but at least made things
> incremental.
>
> Does somebody now a test suite that exists for the idr API, that I could
> run on this new api?
>
> Mike, can you try to run it on your victim: I had such a hard time building
> this patch, that I couldn't re-run the test on my 8-core with this new
> version. So the last results I have are for 2.6.25-rc3-mm1.
>
> Also, I think a careful review should be done to avoid introducing yet other
> problems :-(
>
> *WARNING*: this patch contains a fix for idr.c
> I know, I'm doing things bad, but I only saw the problem this
> afternoon.
>
> It should be applied on linux-2.6.25-rc8-mm1, in the following order:
>
> [ PATCH 01/13 ] : copy_idr_code.patch
> [ PATCH 02/13 ] : change_ridr_struct.patch
> [ PATCH 03/13 ] : ridr_pre_get.patch
> [ PATCH 04/13 ] : ridr_alloc_layer.patch
> [ PATCH 05/13 ] : ridr_free_layer.patch
> [ PATCH 06/13 ] : ridr_sub_alloc.patch
> [ PATCH 07/13 ] : ridr_get_empty_slot.patch
> [ PATCH 08/13 ] : ridr_get_new.patch
> [ PATCH 09/13 ] : ridr_remove.patch
> [ PATCH 10/13 ] : ridr_find.patch
> [ PATCH 11/13 ] : ridr_integrate.patch
> [ PATCH 12/13 ] : ipc_use_ridr.patch
> [ PATCH 13/13 ] : remove_ipc_lock_down.patch
And some more comments on the resulting ridr.c. Note that we might in
fact want to keep the rcu_assign_pointer() calls that I complain about --
see Johannes Berg's posting about making sparse smarter about RCU.
But I include them for completeness.
Thanx, Paul
> /*
> * RCU-based idr API
> */
>
> #ifndef TEST /* to test in user space... */
> #include <linux/slab.h>
> #include <linux/init.h>
> #include <linux/module.h>
> #endif
> #include <linux/err.h>
> #include <linux/string.h>
> #include <linux/ridr.h>
>
> static struct kmem_cache *ridr_layer_cache;
>
> /*
> * Per-cpu pool of preloaded layers
> */
> struct ridr_preget {
> int nr;
> struct ridr_layer *layers[MAX_LEVEL];
> };
> DEFINE_PER_CPU(struct ridr_preget, ridr_pregets) = { 0, };
>
> static inline gfp_t ridr_gfp_mask(struct ridr *idp)
> {
> return idp->gfp_mask & __GFP_BITS_MASK;
> }
>
> static struct ridr_layer *alloc_layer(struct ridr *idp)
> {
> struct ridr_layer *ret = NULL;
> gfp_t gfp_mask = ridr_gfp_mask(idp);
>
> if (!(gfp_mask & __GFP_WAIT)) {
> struct ridr_preget *ridp;
>
> /*
> * Provided the caller has preloaded here, we will always
> * succeed in getting a node here (and never reach
> * kmem_cache_alloc)
> */
> ridp = &__get_cpu_var(ridr_pregets);
> if (ridp->nr) {
> ret = ridp->layers[ridp->nr - 1];
> ridp->layers[ridp->nr - 1] = NULL;
> ridp->nr--;
> }
Might be good to have a BUG_ON(!ret) or some such here?
> }
> if (ret == NULL)
> ret = kmem_cache_alloc(ridr_layer_cache, gfp_mask);
Either that or get kmem_cache_alloc() upset about being called with
preemption disabled. But only sometimes, IIRC.
> return ret;
> }
>
> static void ridr_layer_rcu_free(struct rcu_head *head)
> {
> struct ridr_layer *layer;
>
> layer = container_of(head, struct ridr_layer, rcu_head);
> kmem_cache_free(ridr_layer_cache, layer);
> }
>
> static inline void free_layer(struct ridr_layer *p)
> {
> call_rcu(&p->rcu_head, ridr_layer_rcu_free);
> }
>
> static void ridr_mark_full(struct ridr_layer **pa, int id)
> {
> struct ridr_layer *p = pa[0];
> int l = 0;
>
> __set_bit(id & IDR_MASK, &p->bitmap);
> /*
> * If this layer is full mark the bit in the layer above to
> * show that this part of the radix tree is full. This may
> * complete the layer above and require walking up the radix
> * tree.
> */
> while (p->bitmap == IDR_FULL) {
> p = pa[++l];
> if (!p)
> break;
> id = id >> IDR_BITS;
> __set_bit((id & IDR_MASK), &p->bitmap);
> }
> }
>
> /**
> * ridr_pre_get - reserver resources for ridr allocation
> * @idp: ridr handle
> * @gfp_mask: memory allocation flags
> *
> * Load up this CPU's ridr_layer buffer with sufficient objects to
> * ensure that the addition of a single element in the tree cannot fail.
> *
> * If the system is REALLY out of memory this function returns 0, with
> * preemption enabled.
> * Otherwise 1, with preemption disabled.
> */
> int ridr_pre_get(gfp_t gfp_mask)
> {
> struct ridr_preget *idp;
> struct ridr_layer *layer;
> int ret = 0;
>
> preempt_disable();
> idp = &__get_cpu_var(ridr_pregets);
> while (idp->nr < ARRAY_SIZE(idp->layers)) {
> preempt_enable();
> layer = kmem_cache_alloc(ridr_layer_cache, gfp_mask);
> if (layer == NULL)
> goto out;
Here we potentially spatter free elements across the CPUs, which seems
a bit strange -- unless I am missing something, there has to be a single
lock guarding all updates of a given ridr structure, right?
> preempt_disable();
> idp = &__get_cpu_var(ridr_pregets);
> if (idp->nr < ARRAY_SIZE(idp->layers))
> idp->layers[idp->nr++] = layer;
> else
> kmem_cache_free(ridr_layer_cache, layer);
> }
> ret = 1;
> out:
> return ret;
> }
> EXPORT_SYMBOL(ridr_pre_get);
>
> static int sub_alloc(struct ridr *idp, int *starting_id,
> struct ridr_layer **pa)
> {
> int n, m, sh;
> struct ridr_layer *p, *new;
> int l, id, oid;
> unsigned long bm;
>
> id = *starting_id;
> restart:
> rcu_assign_pointer(p, idp->top);
We don't need the above rcu_assign_pointer(), because "p" is a local
variable. (And we don't publish p's address somewhere that other CPUs
can find it, correct?)
> l = idp->layers;
> rcu_assign_pointer(pa[l--], NULL);
This is a static function, and its caller is also static. So the pa[]
array is always a local variable a ways up the stack, and this need not
be rcu_assign_pointer().
> while (1) {
> /*
> * We run around this while until we reach the leaf node...
> */
> n = (id >> (IDR_BITS*l)) & IDR_MASK;
> bm = ~p->bitmap;
> m = find_next_bit(&bm, IDR_SIZE, n);
> if (m == IDR_SIZE) {
> /* no space available go back to previous layer. */
> l++;
> oid = id;
> id = (id | ((1 << (IDR_BITS * l)) - 1)) + 1;
>
> /* if already at the top layer, we need to grow */
> rcu_assign_pointer(p, pa[l]);
Another unneeded rcu_assign_pointer(), "p" is local.
> if (!p) {
> *starting_id = id;
> return -2;
> }
>
> /* If we need to go up one layer, continue the
> * loop; otherwise, restart from the top.
> */
> sh = IDR_BITS * (l + 1);
> if (oid >> sh == id >> sh)
> continue;
> else
> goto restart;
> }
> if (m != n) {
> sh = IDR_BITS*l;
> id = ((id >> sh) ^ n ^ m) << sh;
> }
> if ((id >= MAX_ID_BIT) || (id < 0))
> return -3;
> if (l == 0)
> break;
> /*
> * Create the layer below if it is missing.
> */
> if (!p->ary[m]) {
> new = alloc_layer(idp);
> if (!new)
> return -1;
> rcu_assign_pointer(p->ary[m], new);
Not yet published, so rcu_assign_pointer() not needed.
> p->count++;
> }
> rcu_assign_pointer(pa[l--], p);
Assignment to local variable (up the stack), so no need for
rcu_assign_pointer().
> p = p->ary[m];
> }
>
> rcu_assign_pointer(pa[l], p);
> return id;
Assignment to local variable (up the stack), so no need for
rcu_assign_pointer().
> }
>
> static int ridr_get_empty_slot(struct ridr *idp, int starting_id,
> struct ridr_layer **pa)
> {
> struct ridr_layer *p, *new;
> int layers, v, id;
>
> id = starting_id;
> build_up:
> p = idp->top;
> layers = idp->layers;
> if (unlikely(!p)) {
> p = alloc_layer(idp);
> if (!p)
> return -1;
> layers = 1;
> }
> /*
> * Add a new layer to the top of the tree if the requested
> * id is larger than the currently allocated space.
> */
> while ((layers < (MAX_LEVEL - 1)) && (id >= (1 << (layers*IDR_BITS)))) {
> layers++;
> if (!p->count)
> continue;
> new = alloc_layer(idp);
> if (!new) {
> /*
> * The allocation failed. If we built part of
> * the structure tear it down.
> */
> for (new = p; p && p != idp->top; new = p) {
> p = p->ary[0];
> new->ary[0] = NULL;
> new->bitmap = new->count = 0;
> free_layer(new);
> }
> return -1;
> }
> rcu_assign_pointer(new->ary[0], p);
The above rcu_assign_pointer() is not needed because we haven't yet
make "new" accessible to other CPUs.
> new->count = 1;
> if (p->bitmap == IDR_FULL)
> __set_bit(0, &new->bitmap);
> rcu_assign_pointer(p, new);
The above need not be rcu_assign_pointer() because "p" is a local variable
that is (I hope!) not being accessed by other CPUs.
> }
> rcu_assign_pointer(idp->top, p);
Interesting... We assign to idp->top whether it changed or not.
Not a problem -- the alternative would make backing out on OOM
quite painful.
> idp->layers = layers;
> v = sub_alloc(idp, &id, pa);
> if (v == -2)
> goto build_up;
> return(v);
> }
>
> static int ridr_get_new_above_int(struct ridr *idp, void *ptr, int starting_id)
> {
> struct ridr_layer *pa[MAX_LEVEL];
> int id;
>
> id = ridr_get_empty_slot(idp, starting_id, pa);
> if (id >= 0) {
> /*
> * Successfully found an empty slot. Install the user
> * pointer and mark the slot full.
> */
> rcu_assign_pointer(pa[0]->ary[id & IDR_MASK],
> (struct ridr_layer *)ptr);
Here we are assigning to the live tree, so we -do- need rcu_assign_pointer().
> pa[0]->count++;
> ridr_mark_full(pa, id);
Is ridr_mark_full() really safe in face of concurrent readers? Seems like
it should be, since it is doing a bunch of __set_bit() calls.
> }
>
> return id;
> }
>
> /**
> * ridr_get_new - allocate new ridr entry
> * @idp: ridr handle
> * @ptr: pointer you want associated with the ide
> * @id: pointer to the allocated handle
> *
> * This is the allocate id function. It should be called with any
> * required locks.
> *
> * If memory is required, it will return -EAGAIN, you should unlock, enable
> * preemption and go back to the ridr_pre_get() call.
> * If the ridr is full, it will return -ENOSPC.
> *
> * @id returns a value in the range 0 ... 0x7fffffff
> */
> int ridr_get_new(struct ridr *idp, void *ptr, int *id)
> {
> int rv;
>
> rv = ridr_get_new_above_int(idp, ptr, 0);
> /*
> * This is a cheap hack until the IDR code can be fixed to
> * return proper error values.
> */
> if (rv < 0) {
> if (rv == -1)
> return -EAGAIN;
> else /* Will be -3 */
> return -ENOSPC;
> }
> *id = rv;
> return 0;
> }
> EXPORT_SYMBOL(ridr_get_new);
>
> static void sub_remove(struct ridr *idp, int shift, int id)
> {
> struct ridr_layer *p = idp->top;
> struct ridr_layer **pa[MAX_LEVEL];
> struct ridr_layer ***paa = &pa[0];
> struct ridr_layer *to_free;
> int n;
>
> *paa = NULL;
> *++paa = &idp->top;
>
> while ((shift > 0) && p) {
> n = (id >> shift) & IDR_MASK;
> __clear_bit(n, &p->bitmap);
> *++paa = &p->ary[n];
> p = p->ary[n];
> shift -= IDR_BITS;
> }
> n = id & IDR_MASK;
> if (likely(p != NULL && test_bit(n, &p->bitmap))) {
> __clear_bit(n, &p->bitmap);
> p->ary[n] = NULL;
> to_free = NULL;
> while (*paa && !--((**paa)->count)) {
> if (to_free)
> free_layer(to_free);
> to_free = **paa;
> **paa-- = NULL;
> }
> if (!*paa)
> idp->layers = 0;
> if (to_free)
> free_layer(to_free);
> } else
> idr_remove_warning("ridr_remove", id);
> }
>
> /**
> * ridr_remove - remove the given id and free it's slot
> * @idp: ridr handle
> * @id: unique key
> */
> void ridr_remove(struct ridr *idp, int id)
> {
> struct ridr_layer *p, *to_free;
>
> /* Mask off upper bits we don't use for the search. */
> id &= MAX_ID_MASK;
>
> sub_remove(idp, (idp->layers - 1) * IDR_BITS, id);
> if (idp->top && idp->top->count == 1 && (idp->layers > 1) &&
> idp->top->ary[0]) { /* We can drop a layer */
Why do we drop layers both in sub_remove() and here?
Hmmm... For the same reason we do in idr_remove(), I guess. Whatever
reason that might be. ;-)
> to_free = idp->top;
> p = idp->top->ary[0];
> idp->top = p;
> --idp->layers;
> to_free->bitmap = to_free->count = 0;
> free_layer(to_free);
> }
> return;
> }
> EXPORT_SYMBOL(ridr_remove);
>
> /**
> * ridr_find - return pointer for given id
> * @idp: ridr handle
> * @id: lookup key
> *
> * Return the pointer given the id it has been registered with. A %NULL
> * return indicates that @id is not valid or you passed %NULL in
> * ridr_get_new().
> *
> * The caller must serialize ridr_find() vs ridr_get_new() and ridr_remove().
> */
> void *ridr_find(struct ridr *idp, int id)
> {
> int n;
> struct ridr_layer *p;
>
> n = idp->layers * IDR_BITS;
> p = rcu_dereference(idp->top);
>
> /* Mask off upper bits we don't use for the search. */
> id &= MAX_ID_MASK;
>
> if (id >= (1 << n))
> return NULL;
>
> while (n > 0 && p) {
> n -= IDR_BITS;
> p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]);
> }
> return((void *)p);
> }
> EXPORT_SYMBOL(ridr_find);
>
> static void ridr_cache_ctor(struct kmem_cache *ridr_layer_cache,
> void *ridr_layer)
> {
> memset(ridr_layer, 0, sizeof(struct ridr_layer));
> }
>
> void __init ridr_init_cache(void)
> {
> ridr_layer_cache = kmem_cache_create("ridr_layer_cache",
> sizeof(struct ridr_layer), 0, SLAB_PANIC,
> ridr_cache_ctor);
> }
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-14 8:33 ` Nadia Derbey
2008-04-14 10:52 ` Nadia Derbey
2008-04-14 18:54 ` Manfred Spraul
@ 2008-04-19 23:28 ` Paul E. McKenney
2008-04-21 8:07 ` Nadia Derbey
2 siblings, 1 reply; 30+ messages in thread
From: Paul E. McKenney @ 2008-04-19 23:28 UTC (permalink / raw)
To: Nadia Derbey; +Cc: Peter Zijlstra, efault, manfred, linux-kernel, akpm, xemul
On Mon, Apr 14, 2008 at 10:33:23AM +0200, Nadia Derbey wrote:
> Peter Zijlstra wrote:
> >On Mon, 2008-04-14 at 07:18 +0200, Nadia Derbey wrote:
> >
> >>Peter Zijlstra wrote:
> >>
> >>>On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
> >>>
> >>>
> >>>>Here is finally the ipc ridr-based implementation I was talking about
> >>>>last
> >>>>week (see http://lkml.org/lkml/2008/4/4/208).
> >>>>I couldn't avoid much of the code duplication, but at least made things
> >>>>incremental.
> >>>>
> >>>>Does somebody now a test suite that exists for the idr API, that I could
> >>>>run on this new api?
> >>>>
> >>>>Mike, can you try to run it on your victim: I had such a hard time
> >>>>building
> >>>>this patch, that I couldn't re-run the test on my 8-core with this new
> >>>>version. So the last results I have are for 2.6.25-rc3-mm1.
> >>>>
> >>>>Also, I think a careful review should be done to avoid introducing yet
> >>>>other
> >>>>problems :-(
> >>>
> >>>
> >>>Why duplicate the whole thing, when we converted the Radix tree to be
> >>>RCU safe we did it in-place. Is there a reason this is not done for idr?
> >>>
> >>>
> >>>
> >>
> >>I did that because I wanted to go fast and try to fix the performance
> >>problem we have with sysV ipc's. I didn't want to introduce (yet other)
> >>regressions in the code that uses idr's today and that works well ;-)
> >>May be in the future if this rcu based api appears to be ok, we can
> >>replace one with the other?
> >
> >
> >>From what I can see the API doesn't change at all,
>
> Well, 1 interface changes, 1 is added and another one went away:
>
> 1) for the preload part (it becomes like the radix-tree preload part):
>
> int idr_pre_get(struct idr *, gfp_t);
> would become
> int idr_pre_get(gfp_t);
>
> 2) idr_pre_get_end() is added (same as radix_tree_preload_end()).
>
> 3) The idr_init() disappears.
>
> You might see that other interfaces are not provided by ridr, but this
> is only because I've taken those that are useful for the ipc part (so
> should not be a problem to make the whole thing rcu safe).
Part of this is because you need to allow the caller to choose the
locking for updates. Mightn't it be better to have both styles of
API, and share the bit-twiddling and tree-walking code?
> >so I don't see why
> >you need to duplicate - either the new code works as expected or its
> >broken.
>
> That's why I asked for an "IDR test suite": I wanted to test potential
> regressions.
That would be good -- certainly the #ifdef TEST leads one to believe
that such a test suite existed at some time. ;-)
Thanx, Paul
> >If it works its good enough for all IDR users, if its broken we
> >should fix it. Seems simple enough.. am I missing something obvious?
> >
>
> Regards,
> Nadia
>
>
>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-19 23:25 ` Paul E. McKenney
@ 2008-04-21 5:59 ` Nadia Derbey
2008-04-29 14:35 ` Nadia Derbey
1 sibling, 0 replies; 30+ messages in thread
From: Nadia Derbey @ 2008-04-21 5:59 UTC (permalink / raw)
To: paulmck; +Cc: efault, manfred, linux-kernel, akpm, peterz, xemul
Paul E. McKenney wrote:
> On Fri, Apr 11, 2008 at 06:17:02PM +0200, Nadia.Derbey@bull.net wrote:
>
>>
>>Here is finally the ipc ridr-based implementation I was talking about last
>>week (see http://lkml.org/lkml/2008/4/4/208).
>>I couldn't avoid much of the code duplication, but at least made things
>>incremental.
>>
>>Does somebody now a test suite that exists for the idr API, that I could
>>run on this new api?
>>
>>Mike, can you try to run it on your victim: I had such a hard time building
>>this patch, that I couldn't re-run the test on my 8-core with this new
>>version. So the last results I have are for 2.6.25-rc3-mm1.
>>
>>Also, I think a careful review should be done to avoid introducing yet other
>>problems :-(
>>
>>*WARNING*: this patch contains a fix for idr.c
>> I know, I'm doing things bad, but I only saw the problem this
>> afternoon.
>>
>>It should be applied on linux-2.6.25-rc8-mm1, in the following order:
>>
>>[ PATCH 01/13 ] : copy_idr_code.patch
>>[ PATCH 02/13 ] : change_ridr_struct.patch
>>[ PATCH 03/13 ] : ridr_pre_get.patch
>>[ PATCH 04/13 ] : ridr_alloc_layer.patch
>>[ PATCH 05/13 ] : ridr_free_layer.patch
>>[ PATCH 06/13 ] : ridr_sub_alloc.patch
>>[ PATCH 07/13 ] : ridr_get_empty_slot.patch
>>[ PATCH 08/13 ] : ridr_get_new.patch
>>[ PATCH 09/13 ] : ridr_remove.patch
>>[ PATCH 10/13 ] : ridr_find.patch
>>[ PATCH 11/13 ] : ridr_integrate.patch
>>[ PATCH 12/13 ] : ipc_use_ridr.patch
>>[ PATCH 13/13 ] : remove_ipc_lock_down.patch
>
>
> And some more comments on the resulting ridr.c. Note that we might in
> fact want to keep the rcu_assign_pointer() calls that I complain about --
> see Johannes Berg's posting about making sparse smarter about RCU.
>
Paul,
Thanks a lot for the review, but I have in any case to rework my
patches: I have left calls to sleeping functions inside the
ridr_pre_get() / ridr_preget_end() section which is a very bad thing.
I'll rework everything and resend.
Regards,
Nadia
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-19 23:28 ` Paul E. McKenney
@ 2008-04-21 8:07 ` Nadia Derbey
2008-04-21 14:44 ` Paul E. McKenney
0 siblings, 1 reply; 30+ messages in thread
From: Nadia Derbey @ 2008-04-21 8:07 UTC (permalink / raw)
To: paulmck; +Cc: Peter Zijlstra, efault, manfred, linux-kernel, akpm, xemul
[-- Attachment #1: Type: text/plain, Size: 2802 bytes --]
Paul E. McKenney wrote:
> On Mon, Apr 14, 2008 at 10:33:23AM +0200, Nadia Derbey wrote:
>
>>Peter Zijlstra wrote:
>>
>>>On Mon, 2008-04-14 at 07:18 +0200, Nadia Derbey wrote:
>>>
>>>
>>>>Peter Zijlstra wrote:
>>>>
>>>>
>>>>>On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
>>>>>
>>>>>
>>>>>
>>>>>>Here is finally the ipc ridr-based implementation I was talking about
>>>>>>last
>>>>>>week (see http://lkml.org/lkml/2008/4/4/208).
>>>>>>I couldn't avoid much of the code duplication, but at least made things
>>>>>>incremental.
>>>>>>
>>>>>>Does somebody now a test suite that exists for the idr API, that I could
>>>>>>run on this new api?
>>>>>>
>>>>>>Mike, can you try to run it on your victim: I had such a hard time
>>>>>>building
>>>>>>this patch, that I couldn't re-run the test on my 8-core with this new
>>>>>>version. So the last results I have are for 2.6.25-rc3-mm1.
>>>>>>
>>>>>>Also, I think a careful review should be done to avoid introducing yet
>>>>>>other
>>>>>>problems :-(
>>>>>
>>>>>
>>>>>Why duplicate the whole thing, when we converted the Radix tree to be
>>>>>RCU safe we did it in-place. Is there a reason this is not done for idr?
>>>>>
>>>>>
>>>>>
>>>>
>>>>I did that because I wanted to go fast and try to fix the performance
>>>>problem we have with sysV ipc's. I didn't want to introduce (yet other)
>>>>regressions in the code that uses idr's today and that works well ;-)
>>>>May be in the future if this rcu based api appears to be ok, we can
>>>>replace one with the other?
>>>
>>>
>>>>From what I can see the API doesn't change at all,
>>
>>Well, 1 interface changes, 1 is added and another one went away:
>>
>>1) for the preload part (it becomes like the radix-tree preload part):
>>
>>int idr_pre_get(struct idr *, gfp_t);
>>would become
>>int idr_pre_get(gfp_t);
>>
>>2) idr_pre_get_end() is added (same as radix_tree_preload_end()).
>>
>>3) The idr_init() disappears.
>>
>>You might see that other interfaces are not provided by ridr, but this
>>is only because I've taken those that are useful for the ipc part (so
>>should not be a problem to make the whole thing rcu safe).
>
>
> Part of this is because you need to allow the caller to choose the
> locking for updates. Mightn't it be better to have both styles of
> API, and share the bit-twiddling and tree-walking code?
>
>
That's what I wanted to get to. But it is very hard to do code
factorization since
1. the routines use pointers to different structures and access to these
piinters can be anywhere in the routines.
2. we may have rcu assignment instead of direct pointer assignements
anywhere in these routines.
In a first try, I finally ended up with huuuuge macros that wouldn't
have been accepted (I attached one of the patches if interested).
Regards,
Nadia
[-- Attachment #2: ridr_get_new.patch.bz2 --]
[-- Type: application/x-redhat-package-manager, Size: 3719 bytes --]
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-21 8:07 ` Nadia Derbey
@ 2008-04-21 14:44 ` Paul E. McKenney
0 siblings, 0 replies; 30+ messages in thread
From: Paul E. McKenney @ 2008-04-21 14:44 UTC (permalink / raw)
To: Nadia Derbey; +Cc: Peter Zijlstra, efault, manfred, linux-kernel, akpm, xemul
On Mon, Apr 21, 2008 at 10:07:39AM +0200, Nadia Derbey wrote:
> Paul E. McKenney wrote:
> >On Mon, Apr 14, 2008 at 10:33:23AM +0200, Nadia Derbey wrote:
> >
> >>Peter Zijlstra wrote:
> >>
> >>>On Mon, 2008-04-14 at 07:18 +0200, Nadia Derbey wrote:
> >>>
> >>>
> >>>>Peter Zijlstra wrote:
> >>>>
> >>>>
> >>>>>On Fri, 2008-04-11 at 18:17 +0200, Nadia.Derbey@bull.net wrote:
> >>>>>
> >>>>>
> >>>>>
> >>>>>>Here is finally the ipc ridr-based implementation I was talking about
> >>>>>>last
> >>>>>>week (see http://lkml.org/lkml/2008/4/4/208).
> >>>>>>I couldn't avoid much of the code duplication, but at least made
> >>>>>>things
> >>>>>>incremental.
> >>>>>>
> >>>>>>Does somebody now a test suite that exists for the idr API, that I
> >>>>>>could
> >>>>>>run on this new api?
> >>>>>>
> >>>>>>Mike, can you try to run it on your victim: I had such a hard time
> >>>>>>building
> >>>>>>this patch, that I couldn't re-run the test on my 8-core with this new
> >>>>>>version. So the last results I have are for 2.6.25-rc3-mm1.
> >>>>>>
> >>>>>>Also, I think a careful review should be done to avoid introducing
> >>>>>>yet other
> >>>>>>problems :-(
> >>>>>
> >>>>>
> >>>>>Why duplicate the whole thing, when we converted the Radix tree to be
> >>>>>RCU safe we did it in-place. Is there a reason this is not done for
> >>>>>idr?
> >>>>>
> >>>>>
> >>>>>
> >>>>
> >>>>I did that because I wanted to go fast and try to fix the performance
> >>>>problem we have with sysV ipc's. I didn't want to introduce (yet other)
> >>>>regressions in the code that uses idr's today and that works well ;-)
> >>>>May be in the future if this rcu based api appears to be ok, we can
> >>>>replace one with the other?
> >>>
> >>>
> >>>>From what I can see the API doesn't change at all,
> >>
> >>Well, 1 interface changes, 1 is added and another one went away:
> >>
> >>1) for the preload part (it becomes like the radix-tree preload part):
> >>
> >>int idr_pre_get(struct idr *, gfp_t);
> >>would become
> >>int idr_pre_get(gfp_t);
> >>
> >>2) idr_pre_get_end() is added (same as radix_tree_preload_end()).
> >>
> >>3) The idr_init() disappears.
> >>
> >>You might see that other interfaces are not provided by ridr, but this
> >>is only because I've taken those that are useful for the ipc part (so
> >>should not be a problem to make the whole thing rcu safe).
> >
> >
> >Part of this is because you need to allow the caller to choose the
> >locking for updates. Mightn't it be better to have both styles of
> >API, and share the bit-twiddling and tree-walking code?
>
> That's what I wanted to get to. But it is very hard to do code
> factorization since
> 1. the routines use pointers to different structures and access to these
> piinters can be anywhere in the routines.
> 2. we may have rcu assignment instead of direct pointer assignements
> anywhere in these routines.
>
> In a first try, I finally ended up with huuuuge macros that wouldn't
> have been accepted (I attached one of the patches if interested).
My guess is that if you move the freelist back from the per-CPU
freelist back into the structure, that the differences would not
be all that large.
Thanx, Paul
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/13] Re: Scalability requirements for sysv ipc
2008-04-19 23:25 ` Paul E. McKenney
2008-04-21 5:59 ` Nadia Derbey
@ 2008-04-29 14:35 ` Nadia Derbey
1 sibling, 0 replies; 30+ messages in thread
From: Nadia Derbey @ 2008-04-29 14:35 UTC (permalink / raw)
To: paulmck; +Cc: efault, manfred, linux-kernel, akpm, peterz, xemul
Paul E. McKenney wrote:
> On Fri, Apr 11, 2008 at 06:17:02PM +0200, Nadia.Derbey@bull.net wrote:
>
>>
>>Here is finally the ipc ridr-based implementation I was talking about last
>>week (see http://lkml.org/lkml/2008/4/4/208).
>>I couldn't avoid much of the code duplication, but at least made things
>>incremental.
>>
>>Does somebody now a test suite that exists for the idr API, that I could
>>run on this new api?
>>
>>Mike, can you try to run it on your victim: I had such a hard time building
>>this patch, that I couldn't re-run the test on my 8-core with this new
>>version. So the last results I have are for 2.6.25-rc3-mm1.
>>
>>Also, I think a careful review should be done to avoid introducing yet other
>>problems :-(
>>
>>*WARNING*: this patch contains a fix for idr.c
>> I know, I'm doing things bad, but I only saw the problem this
>> afternoon.
>>
>>It should be applied on linux-2.6.25-rc8-mm1, in the following order:
>>
>>[ PATCH 01/13 ] : copy_idr_code.patch
>>[ PATCH 02/13 ] : change_ridr_struct.patch
>>[ PATCH 03/13 ] : ridr_pre_get.patch
>>[ PATCH 04/13 ] : ridr_alloc_layer.patch
>>[ PATCH 05/13 ] : ridr_free_layer.patch
>>[ PATCH 06/13 ] : ridr_sub_alloc.patch
>>[ PATCH 07/13 ] : ridr_get_empty_slot.patch
>>[ PATCH 08/13 ] : ridr_get_new.patch
>>[ PATCH 09/13 ] : ridr_remove.patch
>>[ PATCH 10/13 ] : ridr_find.patch
>>[ PATCH 11/13 ] : ridr_integrate.patch
>>[ PATCH 12/13 ] : ipc_use_ridr.patch
>>[ PATCH 13/13 ] : remove_ipc_lock_down.patch
>
>
> And some more comments on the resulting ridr.c. Note that we might in
> fact want to keep the rcu_assign_pointer() calls that I complain about --
> see Johannes Berg's posting about making sparse smarter about RCU.
>
> But I include them for completeness.
>
> Thanx, Paul
>
>
<snip>
Paul,
Thanks again for your review.
I wanted to answer your questions before resending the patch series.
>>
>>static int ridr_get_new_above_int(struct ridr *idp, void *ptr, int starting_id)
>>{
>> struct ridr_layer *pa[MAX_LEVEL];
>> int id;
>>
>> id = ridr_get_empty_slot(idp, starting_id, pa);
>> if (id >= 0) {
>> /*
>> * Successfully found an empty slot. Install the user
>> * pointer and mark the slot full.
>> */
>> rcu_assign_pointer(pa[0]->ary[id & IDR_MASK],
>> (struct ridr_layer *)ptr);
>
>
> Here we are assigning to the live tree, so we -do- need rcu_assign_pointer().
>
>
>> pa[0]->count++;
>> ridr_mark_full(pa, id);
>
>
> Is ridr_mark_full() really safe in face of concurrent readers? Seems like
> it should be, since it is doing a bunch of __set_bit() calls.
>
Even if it uses set_bit(), it is doing it in a loop on the live tree, so
might not be safe. But ridr_find() (which is the only lockless reader)
doesn't test the bitmaps, but rather non NULL pointers. So it should be OK.
<snip>
>>/**
>> * ridr_remove - remove the given id and free it's slot
>> * @idp: ridr handle
>> * @id: unique key
>> */
>>void ridr_remove(struct ridr *idp, int id)
>>{
>> struct ridr_layer *p, *to_free;
>>
>> /* Mask off upper bits we don't use for the search. */
>> id &= MAX_ID_MASK;
>>
>> sub_remove(idp, (idp->layers - 1) * IDR_BITS, id);
>> if (idp->top && idp->top->count == 1 && (idp->layers > 1) &&
>> idp->top->ary[0]) { /* We can drop a layer */
>
>
> Why do we drop layers both in sub_remove() and here?
>
> Hmmm... For the same reason we do in idr_remove(), I guess. Whatever
> reason that might be. ;-)
>
>
Yes, it's for the same reason, and here is the reason: here we are in a
situation where the topmost layer has a single child in the left most
slot. Since the tree grows by adding layers above the existing ones,
such a situation is reached when only the very first ids remain in the
tree, after the higher ids have been removed. So the tree can be shrunk.
The new patch series follows.
Regards,
Nadia
^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2008-04-29 14:35 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-11 16:17 [PATCH 00/13] Re: Scalability requirements for sysv ipc Nadia.Derbey
2008-04-11 16:17 ` [PATCH 01/13] duplicate idr code Nadia.Derbey
2008-04-11 16:17 ` [PATCH 02/13] Change ridr structure Nadia.Derbey
2008-04-11 16:17 ` [PATCH 03/13] Fix ridr_pre_get() Nadia.Derbey
2008-04-11 16:17 ` [PATCH 04/13] Fix ridr_alloc_layer() Nadia.Derbey
2008-04-11 16:17 ` [PATCH 05/13] Fix free_layer() Nadia.Derbey
2008-04-11 16:17 ` [PATCH 06/13] Fix sub_alloc() Nadia.Derbey
2008-04-11 16:17 ` [PATCH 07/13] Fix get_empty_slot() Nadia.Derbey
2008-04-11 16:17 ` [PATCH 08/13] Fix ridr_get_new_above_int() Nadia.Derbey
2008-04-11 16:17 ` [PATCH 09/13] Fix ridr_remove() Nadia.Derbey
2008-04-11 16:17 ` [PATCH 10/13] Fix ridr_find() Nadia.Derbey
2008-04-11 16:17 ` [PATCH 11/13] Integrate the ridr code Nadia.Derbey
2008-04-11 16:17 ` [PATCH 12/13] Integrate the ridr code into IPC code Nadia.Derbey
2008-04-11 16:17 ` [PATCH 13/13] Get rid of ipc_lock_down() Nadia.Derbey
2008-04-11 16:27 ` [PATCH 00/13] Re: Scalability requirements for sysv ipc Peter Zijlstra
2008-04-14 5:18 ` Nadia Derbey
2008-04-14 7:15 ` Peter Zijlstra
2008-04-14 8:33 ` Nadia Derbey
2008-04-14 10:52 ` Nadia Derbey
2008-04-14 18:54 ` Manfred Spraul
2008-04-15 6:13 ` Nadia Derbey
2008-04-19 23:28 ` Paul E. McKenney
2008-04-21 8:07 ` Nadia Derbey
2008-04-21 14:44 ` Paul E. McKenney
2008-04-14 13:54 ` Mike Galbraith
2008-04-14 15:01 ` Nadia Derbey
2008-04-19 23:24 ` Paul E. McKenney
2008-04-19 23:25 ` Paul E. McKenney
2008-04-21 5:59 ` Nadia Derbey
2008-04-29 14:35 ` Nadia Derbey
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox