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 Original line Diff line number Diff line
@@ -47,6 +47,9 @@ static struct uio_class {
	struct class *class;
	struct class *class;
} *uio_class;
} *uio_class;


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

/*
/*
 * attributes
 * 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 int uio_get_minor(struct uio_device *idev)
{
{
	static DEFINE_MUTEX(minor_lock);
	int retval = -ENOMEM;
	int retval = -ENOMEM;
	int id;
	int id;


@@ -253,7 +255,9 @@ exit:


static void uio_free_minor(struct uio_device *idev)
static void uio_free_minor(struct uio_device *idev)
{
{
	mutex_lock(&minor_lock);
	idr_remove(&uio_idr, idev->minor);
	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;
	struct uio_listener *listener;
	int ret = 0;
	int ret = 0;


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


err_infoopen:
err_infoopen:

	kfree(listener);
	kfree(listener);
err_alloc_listener:


err_alloc_listener:
	module_put(idev->owner);
	module_put(idev->owner);


out:
out:
	unlock_kernel();
	return ret;
	return ret;
}
}