Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031840AbbKECi2 (ORCPT ); Wed, 4 Nov 2015 21:38:28 -0500 Received: from mail4.hitachi.co.jp ([133.145.228.5]:60602 "EHLO mail4.hitachi.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031501AbbKECgx (ORCPT ); Wed, 4 Nov 2015 21:36:53 -0500 Subject: [PATCH 2/5] ramoops: introduce generic init/free functions for prz From: Hiraku Toyooka To: linux-kernel@vger.kernel.org Cc: Tony Luck , Kees Cook , Seiji Aguchi , Mark Salyzyn , Anton Vorontsov , Colin Cross Date: Thu, 05 Nov 2015 11:36:49 +0900 Message-ID: <20151105023649.3367.52208.stgit@arietta> In-Reply-To: <20151105023644.3367.94795.stgit@arietta> References: <20151105023644.3367.94795.stgit@arietta> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5951 Lines: 187 We modifies initialization and freeing code for prz for generic usage. This change * add generic function __ramoops_init_prz() to reduce redundancy between ramoops_init_prz() and ramoops_init_przs(). * rename 'przs' member in struct ramoops_context to 'dprzs' so that it stands for 'dump przs'. * rename ramoops_init_prz() to ramoops_init_dprzs(). * change parameter of ramoops_free_przs() from struct ramoops_context * into struct persistent_ram_zone * in order to make it available for all prz array. Signed-off-by: Hiraku Toyooka Cc: Anton Vorontsov Cc: Colin Cross Cc: Kees Cook Cc: Mark Salyzyn Cc: Seiji Aguchi Cc: Tony Luck Cc: linux-kernel@vger.kernel.org --- fs/pstore/ram.c | 63 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index 6363768..89cc90e 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -83,7 +83,7 @@ MODULE_PARM_DESC(ramoops_ecc, "bytes ECC)"); struct ramoops_context { - struct persistent_ram_zone **przs; + struct persistent_ram_zone **dprzs; struct persistent_ram_zone *cprz; struct persistent_ram_zone *fprz; struct persistent_ram_zone *mprz; @@ -199,7 +199,7 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type, /* Find the next valid persistent_ram_zone for DMESG */ while (cxt->dump_read_cnt < cxt->max_dump_cnt && !prz) { - prz = ramoops_get_next_prz(cxt->przs, &cxt->dump_read_cnt, + prz = ramoops_get_next_prz(cxt->dprzs, &cxt->dump_read_cnt, cxt->max_dump_cnt, id, type, PSTORE_TYPE_DMESG, 1); if (!prz_ok(prz)) @@ -314,10 +314,10 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type, if (part != 1) return -ENOSPC; - if (!cxt->przs) + if (!cxt->dprzs) return -ENOSPC; - prz = cxt->przs[cxt->dump_write_cnt]; + prz = cxt->dprzs[cxt->dump_write_cnt]; hlen = ramoops_write_kmsg_hdr(prz, compressed); if (size + hlen > prz->buffer_size) @@ -339,7 +339,7 @@ static int ramoops_pstore_erase(enum pstore_type_id type, u64 id, int count, case PSTORE_TYPE_DMESG: if (id >= cxt->max_dump_cnt) return -EINVAL; - prz = cxt->przs[id]; + prz = cxt->dprzs[id]; break; case PSTORE_TYPE_CONSOLE: prz = cxt->cprz; @@ -371,21 +371,24 @@ static struct ramoops_context oops_cxt = { }, }; -static void ramoops_free_przs(struct ramoops_context *cxt) +static void ramoops_free_przs(struct persistent_ram_zone **przs) { int i; - cxt->max_dump_cnt = 0; - if (!cxt->przs) + if (!przs) return; - for (i = 0; !IS_ERR_OR_NULL(cxt->przs[i]); i++) - persistent_ram_free(cxt->przs[i]); - kfree(cxt->przs); + for (i = 0; i < !IS_ERR_OR_NULL(przs[i]); i++) + persistent_ram_free(przs[i]); + kfree(przs); } -static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt, - phys_addr_t *paddr, size_t dump_mem_sz) +static int __ramoops_init_prz(struct device *dev, struct ramoops_context *cxt, + struct persistent_ram_zone **prz, + phys_addr_t *paddr, size_t sz, u32 sig, bool zap); + +static int ramoops_init_dprzs(struct device *dev, struct ramoops_context *cxt, + phys_addr_t *paddr, size_t dump_mem_sz) { int err = -ENOMEM; int i; @@ -402,29 +405,24 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt, if (!cxt->max_dump_cnt) return -ENOMEM; - cxt->przs = kzalloc(sizeof(*cxt->przs) * cxt->max_dump_cnt, + cxt->dprzs = kcalloc(cxt->max_dump_cnt, sizeof(*cxt->dprzs), GFP_KERNEL); - if (!cxt->przs) { + if (!cxt->dprzs) { dev_err(dev, "failed to initialize a prz array for dumps\n"); goto fail_prz; } for (i = 0; i < cxt->max_dump_cnt; i++) { - cxt->przs[i] = persistent_ram_new(*paddr, cxt->record_size, 0, - &cxt->ecc_info, - cxt->memtype); - if (IS_ERR(cxt->przs[i])) { - err = PTR_ERR(cxt->przs[i]); - dev_err(dev, "failed to request mem region (0x%zx@0x%llx): %d\n", - cxt->record_size, (unsigned long long)*paddr, err); + err = __ramoops_init_prz(dev, cxt, &cxt->dprzs[i], paddr, + cxt->record_size, 0, false); + if (err) goto fail_prz; - } - *paddr += cxt->record_size; } return 0; fail_prz: - ramoops_free_przs(cxt); + cxt->max_dump_cnt = 0; + ramoops_free_przs(cxt->dprzs); return err; } @@ -432,6 +430,13 @@ static int ramoops_init_prz(struct device *dev, struct ramoops_context *cxt, struct persistent_ram_zone **prz, phys_addr_t *paddr, size_t sz, u32 sig) { + return __ramoops_init_prz(dev, cxt, prz, paddr, sz, sig, true); +} + +static int __ramoops_init_prz(struct device *dev, struct ramoops_context *cxt, + struct persistent_ram_zone **prz, + phys_addr_t *paddr, size_t sz, u32 sig, bool zap) +{ if (!sz) return 0; @@ -451,7 +456,8 @@ static int ramoops_init_prz(struct device *dev, struct ramoops_context *cxt, return err; } - persistent_ram_zap(*prz); + if (zap) + persistent_ram_zap(*prz); *paddr += sz; @@ -503,7 +509,7 @@ static int ramoops_probe(struct platform_device *pdev) dump_mem_sz = cxt->size - cxt->console_size - cxt->ftrace_size - cxt->pmsg_size; - err = ramoops_init_przs(dev, cxt, &paddr, dump_mem_sz); + err = ramoops_init_dprzs(dev, cxt, &paddr, dump_mem_sz); if (err) goto fail_out; @@ -573,7 +579,8 @@ fail_init_mprz: fail_init_fprz: persistent_ram_free(cxt->cprz); fail_init_cprz: - ramoops_free_przs(cxt); + cxt->max_dump_cnt = 0; + ramoops_free_przs(cxt->dprzs); fail_out: return err; } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/