projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[MIPS] Fast path for rdhwr emulation for TLS
[powerpc.git]
/
lib
/
idr.c
diff --git
a/lib/idr.c
b/lib/idr.c
index
4d09681
..
16d2143
100644
(file)
--- a/
lib/idr.c
+++ b/
lib/idr.c
@@
-38,14
+38,15
@@
static kmem_cache_t *idr_layer_cache;
static struct idr_layer *alloc_layer(struct idr *idp)
{
struct idr_layer *p;
static struct idr_layer *alloc_layer(struct idr *idp)
{
struct idr_layer *p;
+ unsigned long flags;
- spin_lock
(&idp->lock
);
+ spin_lock
_irqsave(&idp->lock, flags
);
if ((p = idp->id_free)) {
idp->id_free = p->ary[0];
idp->id_free_cnt--;
p->ary[0] = NULL;
}
if ((p = idp->id_free)) {
idp->id_free = p->ary[0];
idp->id_free_cnt--;
p->ary[0] = NULL;
}
- spin_unlock
(&idp->lock
);
+ spin_unlock
_irqrestore(&idp->lock, flags
);
return(p);
}
return(p);
}
@@
-59,12
+60,14
@@
static void __free_layer(struct idr *idp, struct idr_layer *p)
static void free_layer(struct idr *idp, struct idr_layer *p)
{
static void free_layer(struct idr *idp, struct idr_layer *p)
{
+ unsigned long flags;
+
/*
* Depends on the return element being zeroed.
*/
/*
* Depends on the return element being zeroed.
*/
- spin_lock
(&idp->lock
);
+ spin_lock
_irqsave(&idp->lock, flags
);
__free_layer(idp, p);
__free_layer(idp, p);
- spin_unlock
(&idp->lock
);
+ spin_unlock
_irqrestore(&idp->lock, flags
);
}
/**
}
/**
@@
-168,6
+171,7
@@
static int idr_get_new_above_int(struct idr *idp, void *ptr, int starting_id)
{
struct idr_layer *p, *new;
int layers, v, id;
{
struct idr_layer *p, *new;
int layers, v, id;
+ unsigned long flags;
id = starting_id;
build_up:
id = starting_id;
build_up:
@@
-191,14
+195,14
@@
build_up:
* The allocation failed. If we built part of
* the structure tear it down.
*/
* The allocation failed. If we built part of
* the structure tear it down.
*/
- spin_lock
(&idp->lock
);
+ 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);
}
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
(&idp->lock
);
+ spin_unlock
_irqrestore(&idp->lock, flags
);
return -1;
}
new->ary[0] = p;
return -1;
}
new->ary[0] = p;