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

Commit 048cd588 authored by David John's avatar David John Committed by Jonathan Corbet
Browse files

RTC: Remove the BKL.



Remove calls to the BKL since concurrent access is protected
by the spin lock rtc_lock.

Signed-off-by: default avatarDavid John <davidjon@xenontk.org>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent 4a6908a3
Loading
Loading
Loading
Loading
+4 −13
Original line number Diff line number Diff line
@@ -48,9 +48,10 @@
 *		CONFIG_HPET_EMULATE_RTC
 *	1.12a	Maciej W. Rozycki: Handle memory-mapped chips properly.
 *	1.12ac	Alan Cox: Allow read access to the day of week register
 *	1.12b	David John: Remove calls to the BKL.
 */

#define RTC_VERSION		"1.12ac"
#define RTC_VERSION		"1.12b"

/*
 *	Note that *all* calls to CMOS_READ and CMOS_WRITE are done with
@@ -73,7 +74,6 @@
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/spinlock.h>
#include <linux/smp_lock.h>
#include <linux/sysctl.h>
#include <linux/wait.h>
#include <linux/bcd.h>
@@ -182,8 +182,8 @@ static int rtc_proc_open(struct inode *inode, struct file *file);

/*
 * rtc_status is never changed by rtc_interrupt, and ioctl/open/close is
 * protected by the big kernel lock. However, ioctl can still disable the timer
 * in rtc_status and then with del_timer after the interrupt has read
 * protected by the spin lock rtc_lock. However, ioctl can still disable the
 * timer in rtc_status and then with del_timer after the interrupt has read
 * rtc_status but before mod_timer is called, which would then reenable the
 * timer (but you would need to have an awful timing before you'd trip on it)
 */
@@ -720,9 +720,7 @@ static int rtc_do_ioctl(unsigned int cmd, unsigned long arg, int kernel)
static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	long ret;
	lock_kernel();
	ret = rtc_do_ioctl(cmd, arg, 0);
	unlock_kernel();
	return ret;
}

@@ -731,12 +729,8 @@ static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 *	Also clear the previous interrupt data on an open, and clean
 *	up things on a close.
 */

/* We use rtc_lock to protect against concurrent opens. So the BKL is not
 * needed here. Or anywhere else in this driver. */
static int rtc_open(struct inode *inode, struct file *file)
{
	lock_kernel();
	spin_lock_irq(&rtc_lock);

	if (rtc_status & RTC_IS_OPEN)
@@ -746,12 +740,10 @@ static int rtc_open(struct inode *inode, struct file *file)

	rtc_irq_data = 0;
	spin_unlock_irq(&rtc_lock);
	unlock_kernel();
	return 0;

out_busy:
	spin_unlock_irq(&rtc_lock);
	unlock_kernel();
	return -EBUSY;
}

@@ -800,7 +792,6 @@ no_irq:
}

#ifdef RTC_IRQ
/* Called without the kernel lock - fine */
static unsigned int rtc_poll(struct file *file, poll_table *wait)
{
	unsigned long l;