Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0d4a7bc1 authored by Jonathan Corbet's avatar Jonathan Corbet
Browse files

UIO: BKL removal



Fill in needed locking around idr accesses, then remove the big kernel lock
from the UIO driver.  Since there are no in-tree UIO drivers with open()
methods, no further BKL pushdown is required.

Acked-by: default avatarHans J. Koch <hjk@linutronix.de>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent 3fa8749e
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ static struct uio_class {
	struct class *class;
} *uio_class;

/* Protect idr accesses */
static DEFINE_MUTEX(minor_lock);

/*
 * attributes
 */
@@ -231,7 +234,6 @@ static void uio_dev_del_attributes(struct uio_device *idev)

static int uio_get_minor(struct uio_device *idev)
{
	static DEFINE_MUTEX(minor_lock);
	int retval = -ENOMEM;
	int id;

@@ -253,7 +255,9 @@ static int uio_get_minor(struct uio_device *idev)

static void uio_free_minor(struct uio_device *idev)
{
	mutex_lock(&minor_lock);
	idr_remove(&uio_idr, idev->minor);
	mutex_unlock(&minor_lock);
}

/**
@@ -297,8 +301,9 @@ static int uio_open(struct inode *inode, struct file *filep)
	struct uio_listener *listener;
	int ret = 0;

	lock_kernel();
	mutex_lock(&minor_lock);
	idev = idr_find(&uio_idr, iminor(inode));
	mutex_unlock(&minor_lock);
	if (!idev) {
		ret = -ENODEV;
		goto out;
@@ -324,18 +329,15 @@ static int uio_open(struct inode *inode, struct file *filep)
		if (ret)
			goto err_infoopen;
	}
	unlock_kernel();
	return 0;

err_infoopen:

	kfree(listener);
err_alloc_listener:

err_alloc_listener:
	module_put(idev->owner);

out:
	unlock_kernel();
	return ret;
}