From: "Rafael J. Wysocki" <rjw@sisk.pl> To: linux-sh@vger.kernel.org Cc: Linux PM mailing list <linux-pm@lists.linux-foundation.org>, LKML <linux-kernel@vger.kernel.org>, Magnus Damm <magnus.damm@gmail.com>, Alan Stern <stern@rowland.harvard.edu> Subject: [PATCH 1/2 v2] PM: Change PM subsys_data lock type into spinlock Date: Sun, 21 Aug 2011 19:10:45 +0000 [thread overview] Message-ID: <201108212110.45316.rjw@sisk.pl> (raw) In-Reply-To: <201108212109.30399.rjw@sisk.pl> From: Rafael J. Wysocki <rjw@sisk.pl> The lock member of struct pm_subsys_data is of type struct mutex, which is a problem, because the suspend and resume routines defined in drivers/base/power/clock_ops.c cannot be executed with interrupts disabled for this reason. Modify struct pm_subsys_data so that its lock member is a spinlock. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> --- drivers/base/power/clock_ops.c | 35 +++++++++++++++++++++-------------- drivers/base/power/common.c | 2 +- include/linux/pm.h | 2 +- 3 files changed, 23 insertions(+), 16 deletions(-) Index: linux/include/linux/pm.h =================================--- linux.orig/include/linux/pm.h +++ linux/include/linux/pm.h @@ -438,7 +438,7 @@ struct pm_domain_data { }; struct pm_subsys_data { - struct mutex lock; + spinlock_t lock; unsigned int refcount; #ifdef CONFIG_PM_CLK struct list_head clock_list; Index: linux/drivers/base/power/clock_ops.c =================================--- linux.orig/drivers/base/power/clock_ops.c +++ linux/drivers/base/power/clock_ops.c @@ -43,6 +43,7 @@ int pm_clk_add(struct device *dev, const { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; if (!psd) return -EINVAL; @@ -63,9 +64,9 @@ int pm_clk_add(struct device *dev, const } } - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_add_tail(&ce->node, &psd->clock_list); - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } @@ -109,11 +110,12 @@ void pm_clk_remove(struct device *dev, c { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; if (!psd) return; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) { if (!con_id && !ce->con_id) { @@ -127,7 +129,7 @@ void pm_clk_remove(struct device *dev, c } } - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); } /** @@ -169,16 +171,17 @@ void pm_clk_destroy(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce, *c; + unsigned long flags; if (!psd) return; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry_safe_reverse(ce, c, &psd->clock_list, node) __pm_clk_remove(ce); - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); dev_pm_put_subsys_data(dev); } @@ -212,13 +215,14 @@ int pm_clk_suspend(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; dev_dbg(dev, "%s()\n", __func__); if (!psd) return 0; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry_reverse(ce, &psd->clock_list, node) { if (ce->status = PCE_STATUS_NONE) @@ -230,7 +234,7 @@ int pm_clk_suspend(struct device *dev) } } - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } @@ -243,13 +247,14 @@ int pm_clk_resume(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; dev_dbg(dev, "%s()\n", __func__); if (!psd) return 0; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) { if (ce->status = PCE_STATUS_NONE) @@ -261,7 +266,7 @@ int pm_clk_resume(struct device *dev) } } - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } @@ -336,6 +341,7 @@ int pm_clk_suspend(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; dev_dbg(dev, "%s()\n", __func__); @@ -343,12 +349,12 @@ int pm_clk_suspend(struct device *dev) if (!psd || !dev->driver) return 0; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry_reverse(ce, &psd->clock_list, node) clk_disable(ce->clk); - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } @@ -361,6 +367,7 @@ int pm_clk_resume(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; dev_dbg(dev, "%s()\n", __func__); @@ -368,12 +375,12 @@ int pm_clk_resume(struct device *dev) if (!psd || !dev->driver) return 0; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) clk_enable(ce->clk); - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } Index: linux/drivers/base/power/common.c =================================--- linux.orig/drivers/base/power/common.c +++ linux/drivers/base/power/common.c @@ -34,7 +34,7 @@ int dev_pm_get_subsys_data(struct device if (dev->power.subsys_data) { dev->power.subsys_data->refcount++; } else { - mutex_init(&psd->lock); + spin_lock_init(&psd->lock); psd->refcount = 1; dev->power.subsys_data = psd; pm_clk_init(dev);
WARNING: multiple messages have this Message-ID (diff)
From: "Rafael J. Wysocki" <rjw@sisk.pl> To: linux-sh@vger.kernel.org Cc: Linux PM mailing list <linux-pm@lists.linux-foundation.org>, LKML <linux-kernel@vger.kernel.org>, Magnus Damm <magnus.damm@gmail.com>, Alan Stern <stern@rowland.harvard.edu> Subject: [PATCH 1/2 v2] PM: Change PM subsys_data lock type into spinlock Date: Sun, 21 Aug 2011 21:10:45 +0200 [thread overview] Message-ID: <201108212110.45316.rjw@sisk.pl> (raw) In-Reply-To: <201108212109.30399.rjw@sisk.pl> From: Rafael J. Wysocki <rjw@sisk.pl> The lock member of struct pm_subsys_data is of type struct mutex, which is a problem, because the suspend and resume routines defined in drivers/base/power/clock_ops.c cannot be executed with interrupts disabled for this reason. Modify struct pm_subsys_data so that its lock member is a spinlock. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> --- drivers/base/power/clock_ops.c | 35 +++++++++++++++++++++-------------- drivers/base/power/common.c | 2 +- include/linux/pm.h | 2 +- 3 files changed, 23 insertions(+), 16 deletions(-) Index: linux/include/linux/pm.h =================================================================== --- linux.orig/include/linux/pm.h +++ linux/include/linux/pm.h @@ -438,7 +438,7 @@ struct pm_domain_data { }; struct pm_subsys_data { - struct mutex lock; + spinlock_t lock; unsigned int refcount; #ifdef CONFIG_PM_CLK struct list_head clock_list; Index: linux/drivers/base/power/clock_ops.c =================================================================== --- linux.orig/drivers/base/power/clock_ops.c +++ linux/drivers/base/power/clock_ops.c @@ -43,6 +43,7 @@ int pm_clk_add(struct device *dev, const { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; if (!psd) return -EINVAL; @@ -63,9 +64,9 @@ int pm_clk_add(struct device *dev, const } } - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_add_tail(&ce->node, &psd->clock_list); - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } @@ -109,11 +110,12 @@ void pm_clk_remove(struct device *dev, c { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; if (!psd) return; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) { if (!con_id && !ce->con_id) { @@ -127,7 +129,7 @@ void pm_clk_remove(struct device *dev, c } } - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); } /** @@ -169,16 +171,17 @@ void pm_clk_destroy(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce, *c; + unsigned long flags; if (!psd) return; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry_safe_reverse(ce, c, &psd->clock_list, node) __pm_clk_remove(ce); - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); dev_pm_put_subsys_data(dev); } @@ -212,13 +215,14 @@ int pm_clk_suspend(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; dev_dbg(dev, "%s()\n", __func__); if (!psd) return 0; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry_reverse(ce, &psd->clock_list, node) { if (ce->status == PCE_STATUS_NONE) @@ -230,7 +234,7 @@ int pm_clk_suspend(struct device *dev) } } - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } @@ -243,13 +247,14 @@ int pm_clk_resume(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; dev_dbg(dev, "%s()\n", __func__); if (!psd) return 0; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) { if (ce->status == PCE_STATUS_NONE) @@ -261,7 +266,7 @@ int pm_clk_resume(struct device *dev) } } - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } @@ -336,6 +341,7 @@ int pm_clk_suspend(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; dev_dbg(dev, "%s()\n", __func__); @@ -343,12 +349,12 @@ int pm_clk_suspend(struct device *dev) if (!psd || !dev->driver) return 0; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry_reverse(ce, &psd->clock_list, node) clk_disable(ce->clk); - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } @@ -361,6 +367,7 @@ int pm_clk_resume(struct device *dev) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; + unsigned long flags; dev_dbg(dev, "%s()\n", __func__); @@ -368,12 +375,12 @@ int pm_clk_resume(struct device *dev) if (!psd || !dev->driver) return 0; - mutex_lock(&psd->lock); + spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) clk_enable(ce->clk); - mutex_unlock(&psd->lock); + spin_unlock_irqrestore(&psd->lock, flags); return 0; } Index: linux/drivers/base/power/common.c =================================================================== --- linux.orig/drivers/base/power/common.c +++ linux/drivers/base/power/common.c @@ -34,7 +34,7 @@ int dev_pm_get_subsys_data(struct device if (dev->power.subsys_data) { dev->power.subsys_data->refcount++; } else { - mutex_init(&psd->lock); + spin_lock_init(&psd->lock); psd->refcount = 1; dev->power.subsys_data = psd; pm_clk_init(dev);
next prev parent reply other threads:[~2011-08-21 19:10 UTC|newest] Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-08-20 19:31 [PATCH 0/2] sh-sci / PM: Fix problem with runtime PM callbacks run with interrupts off Rafael J. Wysocki 2011-08-20 19:31 ` Rafael J. Wysocki 2011-08-20 19:32 ` [PATCH 1/2] PM / Runtime: Introduce pm_runtime_irq_unsafe() Rafael J. Wysocki 2011-08-20 19:32 ` Rafael J. Wysocki 2011-08-21 14:55 ` [linux-pm] " Alan Stern 2011-08-21 14:55 ` Alan Stern 2011-08-21 18:09 ` Rafael J. Wysocki 2011-08-21 18:09 ` [linux-pm] " Rafael J. Wysocki 2011-08-21 18:09 ` Rafael J. Wysocki 2011-08-21 14:55 ` Alan Stern 2011-08-20 19:32 ` Rafael J. Wysocki 2011-08-20 19:33 ` [PATCH 2/2] sh-sci / PM: Use power.irq_safe Rafael J. Wysocki 2011-08-20 19:33 ` Rafael J. Wysocki 2011-08-20 19:33 ` Rafael J. Wysocki 2011-08-21 19:09 ` [PATCH 0/2 v2] sh-sci / PM: Fix problem with runtime PM callbacks run with interrupts off Rafael J. Wysocki 2011-08-21 19:09 ` Rafael J. Wysocki 2011-08-21 19:09 ` Rafael J. Wysocki 2011-08-21 19:10 ` Rafael J. Wysocki [this message] 2011-08-21 19:10 ` [PATCH 1/2 v2] PM: Change PM subsys_data lock type into spinlock Rafael J. Wysocki 2011-08-22 6:18 ` [Replacement][PATCH 1/2 v2] PM: Use spinlock instead of mutex in clock management functions Rafael J. Wysocki 2011-08-22 6:18 ` Rafael J. Wysocki 2011-08-22 6:18 ` Rafael J. Wysocki 2011-08-21 19:10 ` [PATCH 1/2 v2] PM: Change PM subsys_data lock type into spinlock Rafael J. Wysocki 2011-08-21 19:11 ` [PATCH 2/2 v2] sh-sci / PM: Use power.irq_safe Rafael J. Wysocki 2011-08-21 19:11 ` Rafael J. Wysocki 2011-08-24 5:33 ` Paul Mundt 2011-08-24 5:33 ` Paul Mundt 2011-08-24 20:52 ` Rafael J. Wysocki 2011-08-24 20:52 ` Rafael J. Wysocki 2011-08-25 1:33 ` Paul Mundt 2011-08-25 1:33 ` Paul Mundt 2011-08-25 1:33 ` Paul Mundt 2011-08-24 20:52 ` Rafael J. Wysocki 2011-08-24 5:33 ` Paul Mundt 2011-08-21 19:11 ` Rafael J. Wysocki
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=201108212110.45316.rjw@sisk.pl \ --to=rjw@sisk.pl \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pm@lists.linux-foundation.org \ --cc=linux-sh@vger.kernel.org \ --cc=magnus.damm@gmail.com \ --cc=stern@rowland.harvard.edu \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.