Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 84267
b: refs/heads/master
c: 47c152b
h: refs/heads/master
i:
  84265: f06e20b
  84263: 2f7ad7a
v: v3
  • Loading branch information
Richard Purdie authored and David Woodhouse committed Feb 3, 2008
1 parent bb913e8 commit b45895b
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6ce0a856c10c8ab8568764436864616efa88e908
refs/heads/master: 47c152b88c185c7e97462a35893df6e552075a8c
28 changes: 28 additions & 0 deletions trunk/drivers/mtd/mtdoops.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <linux/workqueue.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/spinlock.h>
#include <linux/mtd/mtd.h>

#define OOPS_PAGE_SIZE 4096
Expand All @@ -42,6 +43,9 @@ struct mtdoops_context {
int nextcount;

void *oops_buf;

/* writecount and disabling ready are spin lock protected */
spinlock_t writecount_lock;
int ready;
int writecount;
} oops_cxt;
Expand Down Expand Up @@ -290,11 +294,22 @@ static void mtdoops_console_sync(void)
{
struct mtdoops_context *cxt = &oops_cxt;
struct mtd_info *mtd = cxt->mtd;
unsigned long flags;

if (!cxt->ready || !mtd || cxt->writecount == 0)
return;

/*
* Once ready is 0 and we've held the lock no further writes to the
* buffer will happen
*/
spin_lock_irqsave(&cxt->writecount_lock, flags);
if (!cxt->ready) {
spin_unlock_irqrestore(&cxt->writecount_lock, flags);
return;
}
cxt->ready = 0;
spin_unlock_irqrestore(&cxt->writecount_lock, flags);

schedule_work(&cxt->work_write);
}
Expand All @@ -304,6 +319,7 @@ mtdoops_console_write(struct console *co, const char *s, unsigned int count)
{
struct mtdoops_context *cxt = co->data;
struct mtd_info *mtd = cxt->mtd;
unsigned long flags;

if (!oops_in_progress) {
mtdoops_console_sync();
Expand All @@ -313,6 +329,13 @@ mtdoops_console_write(struct console *co, const char *s, unsigned int count)
if (!cxt->ready || !mtd)
return;

/* Locking on writecount ensures sequential writes to the buffer */
spin_lock_irqsave(&cxt->writecount_lock, flags);

/* Check ready status didn't change whilst waiting for the lock */
if (!cxt->ready)
return;

if (cxt->writecount == 0) {
u32 *stamp = cxt->oops_buf;
*stamp = cxt->nextcount;
Expand All @@ -324,6 +347,11 @@ mtdoops_console_write(struct console *co, const char *s, unsigned int count)

memcpy(cxt->oops_buf + cxt->writecount, s, count);
cxt->writecount += count;

spin_unlock_irqrestore(&cxt->writecount_lock, flags);

if (cxt->writecount == OOPS_PAGE_SIZE)
mtdoops_console_sync();
}

static int __init mtdoops_console_setup(struct console *co, char *options)
Expand Down

0 comments on commit b45895b

Please sign in to comment.