On Wed, 25 Apr 2007 20:13:59 +0100 Christoph Hellwig <[EMAIL PROTECTED]> wrote:
> On Wed, Apr 25, 2007 at 05:49:34PM +0200, Matthias Kaehlcke wrote: > > drivers/char/tty_io.c uses a semaphore as mutex. use the mutex API > > instead of the (binary) semaphore > > This looks like it should be a spinlock: > > > - down(&allocated_ptys_lock); > > + mutex_lock(&allocated_ptys_lock); > > idr_remove(&allocated_ptys, idx); > > - up(&allocated_ptys_lock); > > + mutex_unlock(&allocated_ptys_lock); > > idr_remove is a quick operation that doesn't sleep. > > > @@ -2639,24 +2639,24 @@ static int ptmx_open(struct inode * inode, struct > > file * filp) > > nonseekable_open(inode, filp); > > > > /* find a device that is not in use. */ > > - down(&allocated_ptys_lock); > > + mutex_lock(&allocated_ptys_lock); > > if (!idr_pre_get(&allocated_ptys, GFP_KERNEL)) { > > - up(&allocated_ptys_lock); > > The idr_pre_get should be moved out of the lock, that's the whole > point for it's existance.. > I think having it inside the lock makes sense: mutex_lock() idr_pre_get() idr_get_new() mutex_unlock() here, if idr_pre_get() succeeded, we know that idr_get_new() will succeed. otoh: try_again: idr_pre_get() mutex_lock() if (idr_get_new() == failed) { mutex_unlock() goto try_again; } mutex_unlock() is not nice. the IDR api is awful. A little project is to rip out all its internal locking and to implement caller-provided locking. Unfortunately the fact that the library allocates memory means that we might need to do awkward things like radix_tree_preload() to make it reliable for callers who use spinlocking. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/