提交 fda5fe19 编写于 作者: P Paul Parsons 提交者: Jiri Kosina

apm-emulation: apm_mutex breaks ACK; remove it

apm_mutex is locked by a process (e.g. apm -s) at the start of apm_ioctl() and
remains locked while pm_suspend() is called. Any subsequent process trying to
ACK the suspend (e.g. apmd) is then blocked at the start of apm_ioctl(),
causing the suspend to be delayed for 5 seconds in apm_suspend_notifier()
while the ACK times out. In short, ACKs don't work.

The driver's data structures are sufficiently protected by assorted locks. And
pm_suspend() has its own mutex to prevent reentrancy. Consequently there is no
obvious requirement for apm_mutex, which evolved from earlier BKL calls. So
let's remove it.
Signed-off-by: NPaul Parsons <lost.distance@yahoo.com>
Acked-by: NRafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: NJiri Kosina <jkosina@suse.cz>
上级 81024fc4
...@@ -126,7 +126,6 @@ struct apm_user { ...@@ -126,7 +126,6 @@ struct apm_user {
/* /*
* Local variables * Local variables
*/ */
static DEFINE_MUTEX(apm_mutex);
static atomic_t suspend_acks_pending = ATOMIC_INIT(0); static atomic_t suspend_acks_pending = ATOMIC_INIT(0);
static atomic_t userspace_notification_inhibit = ATOMIC_INIT(0); static atomic_t userspace_notification_inhibit = ATOMIC_INIT(0);
static int apm_disabled; static int apm_disabled;
...@@ -275,7 +274,6 @@ apm_ioctl(struct file *filp, u_int cmd, u_long arg) ...@@ -275,7 +274,6 @@ apm_ioctl(struct file *filp, u_int cmd, u_long arg)
if (!as->suser || !as->writer) if (!as->suser || !as->writer)
return -EPERM; return -EPERM;
mutex_lock(&apm_mutex);
switch (cmd) { switch (cmd) {
case APM_IOC_SUSPEND: case APM_IOC_SUSPEND:
mutex_lock(&state_lock); mutex_lock(&state_lock);
...@@ -336,7 +334,6 @@ apm_ioctl(struct file *filp, u_int cmd, u_long arg) ...@@ -336,7 +334,6 @@ apm_ioctl(struct file *filp, u_int cmd, u_long arg)
mutex_unlock(&state_lock); mutex_unlock(&state_lock);
break; break;
} }
mutex_unlock(&apm_mutex);
return err; return err;
} }
...@@ -371,7 +368,6 @@ static int apm_open(struct inode * inode, struct file * filp) ...@@ -371,7 +368,6 @@ static int apm_open(struct inode * inode, struct file * filp)
{ {
struct apm_user *as; struct apm_user *as;
mutex_lock(&apm_mutex);
as = kzalloc(sizeof(*as), GFP_KERNEL); as = kzalloc(sizeof(*as), GFP_KERNEL);
if (as) { if (as) {
/* /*
...@@ -391,7 +387,6 @@ static int apm_open(struct inode * inode, struct file * filp) ...@@ -391,7 +387,6 @@ static int apm_open(struct inode * inode, struct file * filp)
filp->private_data = as; filp->private_data = as;
} }
mutex_unlock(&apm_mutex);
return as ? 0 : -ENOMEM; return as ? 0 : -ENOMEM;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册