Skip to content

Commit

Permalink
pstore: Make spinlock per zone instead of global
Browse files Browse the repository at this point in the history
commit 1097044 upstream.

Currently pstore has a global spinlock for all zones. Since the zones
are independent and modify different areas of memory, there's no need
to have a global lock, so we should use a per-zone lock as introduced
here. Also, when ramoops's ftrace use-case has a FTRACE_PER_CPU flag
introduced later, which splits the ftrace memory area into a single zone
per CPU, it will eliminate the need for locking. In preparation for this,
make the locking optional.

Signed-off-by: Joel Fernandes <[email protected]>
[kees: updated commit message]
Signed-off-by: Kees Cook <[email protected]>
Cc: Leo Yan <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Joel Fernandes authored and leskal committed Aug 12, 2017
1 parent c7a3d35 commit 28d212c
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 6 deletions.
11 changes: 5 additions & 6 deletions fs/pstore/ram_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,24 +94,22 @@ static void buffer_size_add_atomic(struct persistent_ram_zone *prz, size_t a)
} while (atomic_cmpxchg(&prz->buffer->size, old, new) != old);
}

static DEFINE_RAW_SPINLOCK(buffer_lock);

/* increase and wrap the start pointer, returning the old value */
static size_t buffer_start_add_locked(struct persistent_ram_zone *prz, size_t a)
{
int old;
int new;
unsigned long flags;

raw_spin_lock_irqsave(&buffer_lock, flags);
raw_spin_lock_irqsave(&prz->buffer_lock, flags);

old = atomic_read(&prz->buffer->start);
new = old + a;
while (unlikely(new >= prz->buffer_size))
new -= prz->buffer_size;
atomic_set(&prz->buffer->start, new);

raw_spin_unlock_irqrestore(&buffer_lock, flags);
raw_spin_unlock_irqrestore(&prz->buffer_lock, flags);

return old;
}
Expand All @@ -123,7 +121,7 @@ static void buffer_size_add_locked(struct persistent_ram_zone *prz, size_t a)
size_t new;
unsigned long flags;

raw_spin_lock_irqsave(&buffer_lock, flags);
raw_spin_lock_irqsave(&prz->buffer_lock, flags);

old = atomic_read(&prz->buffer->size);
if (old == prz->buffer_size)
Expand All @@ -135,7 +133,7 @@ static void buffer_size_add_locked(struct persistent_ram_zone *prz, size_t a)
atomic_set(&prz->buffer->size, new);

exit:
raw_spin_unlock_irqrestore(&buffer_lock, flags);
raw_spin_unlock_irqrestore(&prz->buffer_lock, flags);
}

static size_t (*buffer_start_add)(struct persistent_ram_zone *, size_t) = buffer_start_add_atomic;
Expand Down Expand Up @@ -503,6 +501,7 @@ static int persistent_ram_post_init(struct persistent_ram_zone *prz, u32 sig,

prz->buffer->sig = sig;
persistent_ram_zap(prz);
prz->buffer_lock = __RAW_SPIN_LOCK_UNLOCKED(buffer_lock);

return 0;
}
Expand Down
1 change: 1 addition & 0 deletions include/linux/pstore_ram.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ struct persistent_ram_zone {
void *vaddr;
struct persistent_ram_buffer *buffer;
size_t buffer_size;
raw_spinlock_t buffer_lock;

/* ECC correction */
char *par_buffer;
Expand Down

0 comments on commit 28d212c

Please sign in to comment.