Messages in this thread Patch in this message |  | | From | Joel Fernandes <> | Subject | [PATCH 2/7] pstore: locking: dont lock unless caller asks to | Date | Fri, 7 Oct 2016 22:28:29 -0700 |
| |
In preparation of not locking at all for certain buffers depending on if there's contention, make locking optional depending if caller requested it.
Signed-off-by: Joel Fernandes <joelaf@google.com> --- fs/pstore/ram.c | 10 +++++----- fs/pstore/ram_core.c | 27 ++++++++++++++++----------- include/linux/pstore_ram.h | 2 +- 3 files changed, 22 insertions(+), 17 deletions(-)
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index f1219af..751197d 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -260,7 +260,7 @@ static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz, compressed ? 'C' : 'D'); WARN_ON_ONCE(!hdr); len = hdr ? strlen(hdr) : 0; - persistent_ram_write(prz, hdr, len); + persistent_ram_write(prz, hdr, len, 1); kfree(hdr); return len; @@ -280,17 +280,17 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type, if (type == PSTORE_TYPE_CONSOLE) { if (!cxt->cprz) return -ENOMEM; - persistent_ram_write(cxt->cprz, buf, size); + persistent_ram_write(cxt->cprz, buf, size, 1); return 0; } else if (type == PSTORE_TYPE_FTRACE) { if (!cxt->fprz) return -ENOMEM; - persistent_ram_write(cxt->fprz, buf, size); + persistent_ram_write(cxt->fprz, buf, size, 1); return 0; } else if (type == PSTORE_TYPE_PMSG) { if (!cxt->mprz) return -ENOMEM; - persistent_ram_write(cxt->mprz, buf, size); + persistent_ram_write(cxt->mprz, buf, size, 1); return 0; } @@ -324,7 +324,7 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type, hlen = ramoops_write_kmsg_hdr(prz, compressed); if (size + hlen > prz->buffer_size) size = prz->buffer_size - hlen; - persistent_ram_write(prz, buf, size); + persistent_ram_write(prz, buf, size, 1); cxt->dump_write_cnt = (cxt->dump_write_cnt + 1) % cxt->max_dump_cnt; diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c index cb92055..c4722f0 100644 --- a/fs/pstore/ram_core.c +++ b/fs/pstore/ram_core.c @@ -49,13 +49,15 @@ static inline size_t buffer_start(struct persistent_ram_zone *prz) } /* increase and wrap the start pointer, returning the old value */ -static size_t buffer_start_add(struct persistent_ram_zone *prz, size_t a) +static size_t buffer_start_add(struct persistent_ram_zone *prz, size_t a, + int lock) { int old; int new; unsigned long flags; - raw_spin_lock_irqsave(&prz->buffer_lock, flags); + if (lock) + raw_spin_lock_irqsave(&prz->buffer_lock, flags); old = atomic_read(&prz->buffer->start); new = old + a; @@ -63,19 +65,21 @@ static size_t buffer_start_add(struct persistent_ram_zone *prz, size_t a) new -= prz->buffer_size; atomic_set(&prz->buffer->start, new); - raw_spin_unlock_irqrestore(&prz->buffer_lock, flags); + if (lock) + raw_spin_unlock_irqrestore(&prz->buffer_lock, flags); return old; } /* increase the size counter until it hits the max size */ -static void buffer_size_add(struct persistent_ram_zone *prz, size_t a) +static void buffer_size_add(struct persistent_ram_zone *prz, size_t a, int lock) { size_t old; size_t new; unsigned long flags; - raw_spin_lock_irqsave(&prz->buffer_lock, flags); + if (lock) + raw_spin_lock_irqsave(&prz->buffer_lock, flags); old = atomic_read(&prz->buffer->size); if (old == prz->buffer_size) @@ -87,7 +91,8 @@ static void buffer_size_add(struct persistent_ram_zone *prz, size_t a) atomic_set(&prz->buffer->size, new); exit: - raw_spin_unlock_irqrestore(&prz->buffer_lock, flags); + if (lock) + raw_spin_unlock_irqrestore(&prz->buffer_lock, flags); } static void notrace persistent_ram_encode_rs8(struct persistent_ram_zone *prz, @@ -300,7 +305,7 @@ void persistent_ram_save_old(struct persistent_ram_zone *prz) } int notrace persistent_ram_write(struct persistent_ram_zone *prz, - const void *s, unsigned int count) + const void *s, unsigned int count, int lock) { int rem; int c = count; @@ -311,9 +316,9 @@ int notrace persistent_ram_write(struct persistent_ram_zone *prz, c = prz->buffer_size; } - buffer_size_add(prz, c); + buffer_size_add(prz, c, lock); - start = buffer_start_add(prz, c); + start = buffer_start_add(prz, c, lock); rem = prz->buffer_size - start; if (unlikely(rem < c)) { @@ -342,9 +347,9 @@ int notrace persistent_ram_write_user(struct persistent_ram_zone *prz, c = prz->buffer_size; } - buffer_size_add(prz, c); + buffer_size_add(prz, c, 1); - start = buffer_start_add(prz, c); + start = buffer_start_add(prz, c, 1); rem = prz->buffer_size - start; if (unlikely(rem < c)) { diff --git a/include/linux/pstore_ram.h b/include/linux/pstore_ram.h index 244d242..782af68 100644 --- a/include/linux/pstore_ram.h +++ b/include/linux/pstore_ram.h @@ -61,7 +61,7 @@ void persistent_ram_free(struct persistent_ram_zone *prz); void persistent_ram_zap(struct persistent_ram_zone *prz); int persistent_ram_write(struct persistent_ram_zone *prz, const void *s, - unsigned int count); + unsigned int count, int lock); int persistent_ram_write_user(struct persistent_ram_zone *prz, const void __user *s, unsigned int count); -- 2.7.4
|  |