From: Nadia.Derbey@bull.net
To: efault@gmx.de
Cc: manfred@colorfullife.com, linux-kernel@vger.kernel.org,
paulmck@linux.vnet.ibm.com, akpm@linux-foundation.org,
peterz@infradead.org, xemul@openvz.org,
Nadia Derbey <Nadia.Derbey@bull.net>
Subject: [PATCH 09/13] Fix ridr_remove()
Date: Fri, 11 Apr 2008 18:17:11 +0200 [thread overview]
Message-ID: <20080411162001.732385000@bull.net> (raw)
In-Reply-To: 20080411161702.460410000@bull.net
[-- 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);
--
next prev parent reply other threads:[~2008-04-11 16:22 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
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 ` Nadia.Derbey [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080411162001.732385000@bull.net \
--to=nadia.derbey@bull.net \
--cc=akpm@linux-foundation.org \
--cc=efault@gmx.de \
--cc=linux-kernel@vger.kernel.org \
--cc=manfred@colorfullife.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=xemul@openvz.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.