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 /fs/pstore | |
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>
Diffstat (limited to 'fs/pstore')
-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); |