diff options
| author | Chuansheng Liu <chuansheng.liu@intel.com> | 2012-09-17 13:43:44 -0400 |
|---|---|---|
| committer | Anton Vorontsov <anton.vorontsov@linaro.org> | 2012-09-20 20:04:50 -0400 |
| commit | 80c9d03c22f13a17df67b4b99a83ed5e9acf6093 (patch) | |
| tree | f12fb83065cf66ca699173a3520d5a37b7860054 | |
| parent | 65f8c95e46a1827ae8bbc52a817ea308dd7d65ae (diff) | |
pstore: Avoid recursive spinlocks in the oops_in_progress case
Like 8250 driver, when pstore is registered as a console,
to avoid recursive spinlocks when panic happening, change the
spin_lock_irqsave to spin_trylock_irqsave when oops_in_progress
is true.
Signed-off-by: liu chuansheng <chuansheng.liu@intel.com>
Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
| -rw-r--r-- | fs/pstore/platform.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 6c23eab7f76c..a40da07e93d6 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c | |||
| @@ -164,7 +164,13 @@ static void pstore_console_write(struct console *con, const char *s, unsigned c) | |||
| 164 | 164 | ||
| 165 | if (c > psinfo->bufsize) | 165 | if (c > psinfo->bufsize) |
| 166 | c = psinfo->bufsize; | 166 | c = psinfo->bufsize; |
| 167 | spin_lock_irqsave(&psinfo->buf_lock, flags); | 167 | |
| 168 | if (oops_in_progress) { | ||
| 169 | if (!spin_trylock_irqsave(&psinfo->buf_lock, flags)) | ||
| 170 | break; | ||
| 171 | } else { | ||
| 172 | spin_lock_irqsave(&psinfo->buf_lock, flags); | ||
| 173 | } | ||
| 168 | memcpy(psinfo->buf, s, c); | 174 | memcpy(psinfo->buf, s, c); |
| 169 | psinfo->write(PSTORE_TYPE_CONSOLE, 0, NULL, 0, c, psinfo); | 175 | psinfo->write(PSTORE_TYPE_CONSOLE, 0, NULL, 0, c, psinfo); |
| 170 | spin_unlock_irqrestore(&psinfo->buf_lock, flags); | 176 | spin_unlock_irqrestore(&psinfo->buf_lock, flags); |
