* [PATCH 2.4.12.5 1/2] lib: allow idr to be used in irq context
@ 2005-08-16 21:55 Luben Tuikov
0 siblings, 0 replies; only message in thread
From: Luben Tuikov @ 2005-08-16 21:55 UTC (permalink / raw)
To: Linux Kernel Mailing List, SCSI Mailing List, Dave Jones,
Jeff Garzik
Cc: Jim Houston
Hi,
This patch allows idr to be used in irq context.
idr_pre_get() is necessary to be called before
idr_get_new() is called. No locking is necessary when
calling idr_pre_get().
But idr_get_new(), idr_find() and idr_remove()
must be serialized with respect to each other.
All of the aforementioned, may end up in alloc_layer()
or free_layer() which grabs the idp lock using spin_lock.
If idr_get_new() or idr_remove() is used in IRQ context,
then we may get a lockup when idr_pre_get was called
in process context and an IRQ interrupted while it held
the idp lock.
This patch changes the spin_lock to spin_lock_irqsave,
and spin_unlock to spin_unlock_irqrestore, to allow
idr_get_new(), idr_find() and idr_remove() to be
called from IRQ context, while idr_pre_get() to be
called in process context.
Signed-off-by: Luben Tuikov <luben_tuikov@adaptec.com>
--- linux-2.6.12.5/lib/idr.c.old 2005-08-16 17:20:08.000000000 -0400
+++ linux-2.6.12.5/lib/idr.c 2005-08-16 17:22:16.000000000 -0400
@@ -37,27 +37,29 @@
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;
}
- spin_unlock(&idp->lock);
+ spin_unlock_irqrestore(&idp->lock, flags);
return(p);
}
static void free_layer(struct idr *idp, struct idr_layer *p)
{
+ unsigned long flags;
/*
* Depends on the return element being zeroed.
*/
- spin_lock(&idp->lock);
+ spin_lock_irqsave(&idp->lock, flags);
p->ary[0] = idp->id_free;
idp->id_free = p;
idp->id_free_cnt++;
- spin_unlock(&idp->lock);
+ spin_unlock_irqrestore(&idp->lock, flags);
}
/**
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2005-08-16 21:56 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-08-16 21:55 [PATCH 2.4.12.5 1/2] lib: allow idr to be used in irq context Luben Tuikov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).