From: Mauro Carvalho Chehab <mchehab@kernel.org>
To: Robert Richter <rrichter@marvell.com>
Cc: Borislav Petkov <bp@alien8.de>, Tony Luck <tony.luck@intel.com>,
James Morse <james.morse@arm.com>,
"linux-edac@vger.kernel.org" <linux-edac@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 02/20] EDAC: Remove EDAC_DIMM_OFF() macro
Date: Sat, 9 Nov 2019 08:27:21 +0100 [thread overview]
Message-ID: <20191109082721.73aeac08@kernel.org> (raw)
In-Reply-To: <20191106093239.25517-3-rrichter@marvell.com>
Em Wed, 6 Nov 2019 09:33:04 +0000
Robert Richter <rrichter@marvell.com> escreveu:
> The EDAC_DIMM_OFF() macro takes 5 arguments to get the DIMM's index.
> This can be much simplified. Store the index in struct dimm_info to
> avoid its calculation and remove the EDAC_DIMM_OFF() macro. The index
> can be directly used.
>
> Another advantage is that edac_mc_alloc() could be used even if the
> exact size of the layers is unknown. Only the number of DIMMs would be
> needed.
>
> Signed-off-by: Robert Richter <rrichter@marvell.com>
Reviewed-by: Mauro Carvalho Chehab <mchehab@kernel.org>
> ---
> drivers/edac/edac_mc.c | 14 ++++-------
> drivers/edac/edac_mc_sysfs.c | 20 ++++------------
> include/linux/edac.h | 45 ++++--------------------------------
> 3 files changed, 13 insertions(+), 66 deletions(-)
>
> diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
> index e6fd079783bd..72088d49b03b 100644
> --- a/drivers/edac/edac_mc.c
> +++ b/drivers/edac/edac_mc.c
> @@ -314,10 +314,10 @@ struct mem_ctl_info *edac_mc_alloc(unsigned int mc_num,
> struct dimm_info *dimm;
> u32 *ce_per_layer[EDAC_MAX_LAYERS], *ue_per_layer[EDAC_MAX_LAYERS];
> unsigned int pos[EDAC_MAX_LAYERS];
> - unsigned int size, tot_dimms = 1, count = 1;
> + unsigned int idx, size, tot_dimms = 1, count = 1;
> unsigned int tot_csrows = 1, tot_channels = 1, tot_errcount = 0;
> void *pvt, *p, *ptr = NULL;
> - int i, j, row, chn, n, len, off;
> + int i, j, row, chn, n, len;
> bool per_rank = false;
>
> BUG_ON(n_layers > EDAC_MAX_LAYERS || n_layers == 0);
> @@ -425,19 +425,15 @@ struct mem_ctl_info *edac_mc_alloc(unsigned int mc_num,
> memset(&pos, 0, sizeof(pos));
> row = 0;
> chn = 0;
> - for (i = 0; i < tot_dimms; i++) {
> + for (idx = 0; idx < tot_dimms; idx++) {
> chan = mci->csrows[row]->channels[chn];
> - off = EDAC_DIMM_OFF(layer, n_layers, pos[0], pos[1], pos[2]);
> - if (off < 0 || off >= tot_dimms) {
> - edac_mc_printk(mci, KERN_ERR, "EDAC core bug: EDAC_DIMM_OFF is trying to do an illegal data access\n");
> - goto error;
> - }
>
> dimm = kzalloc(sizeof(**mci->dimms), GFP_KERNEL);
> if (!dimm)
> goto error;
> - mci->dimms[off] = dimm;
> + mci->dimms[idx] = dimm;
> dimm->mci = mci;
> + dimm->idx = idx;
>
> /*
> * Copy DIMM location and initialize it.
> diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
> index 32d016f1ecd1..91e4c8f155af 100644
> --- a/drivers/edac/edac_mc_sysfs.c
> +++ b/drivers/edac/edac_mc_sysfs.c
> @@ -557,14 +557,8 @@ static ssize_t dimmdev_ce_count_show(struct device *dev,
> {
> struct dimm_info *dimm = to_dimm(dev);
> u32 count;
> - int off;
> -
> - off = EDAC_DIMM_OFF(dimm->mci->layers,
> - dimm->mci->n_layers,
> - dimm->location[0],
> - dimm->location[1],
> - dimm->location[2]);
> - count = dimm->mci->ce_per_layer[dimm->mci->n_layers-1][off];
> +
> + count = dimm->mci->ce_per_layer[dimm->mci->n_layers-1][dimm->idx];
> return sprintf(data, "%u\n", count);
> }
>
> @@ -574,14 +568,8 @@ static ssize_t dimmdev_ue_count_show(struct device *dev,
> {
> struct dimm_info *dimm = to_dimm(dev);
> u32 count;
> - int off;
> -
> - off = EDAC_DIMM_OFF(dimm->mci->layers,
> - dimm->mci->n_layers,
> - dimm->location[0],
> - dimm->location[1],
> - dimm->location[2]);
> - count = dimm->mci->ue_per_layer[dimm->mci->n_layers-1][off];
> +
> + count = dimm->mci->ue_per_layer[dimm->mci->n_layers-1][dimm->idx];
> return sprintf(data, "%u\n", count);
> }
>
> diff --git a/include/linux/edac.h b/include/linux/edac.h
> index 696bfb684d92..79c5564ee314 100644
> --- a/include/linux/edac.h
> +++ b/include/linux/edac.h
> @@ -362,47 +362,6 @@ struct edac_mc_layer {
> */
> #define EDAC_MAX_LAYERS 3
>
> -/**
> - * EDAC_DIMM_OFF - Macro responsible to get a pointer offset inside a pointer
> - * array for the element given by [layer0,layer1,layer2]
> - * position
> - *
> - * @layers: a struct edac_mc_layer array, describing how many elements
> - * were allocated for each layer
> - * @nlayers: Number of layers at the @layers array
> - * @layer0: layer0 position
> - * @layer1: layer1 position. Unused if n_layers < 2
> - * @layer2: layer2 position. Unused if n_layers < 3
> - *
> - * For 1 layer, this macro returns "var[layer0] - var";
> - *
> - * For 2 layers, this macro is similar to allocate a bi-dimensional array
> - * and to return "var[layer0][layer1] - var";
> - *
> - * For 3 layers, this macro is similar to allocate a tri-dimensional array
> - * and to return "var[layer0][layer1][layer2] - var".
> - *
> - * A loop could be used here to make it more generic, but, as we only have
> - * 3 layers, this is a little faster.
> - *
> - * By design, layers can never be 0 or more than 3. If that ever happens,
> - * a NULL is returned, causing an OOPS during the memory allocation routine,
> - * with would point to the developer that he's doing something wrong.
> - */
> -#define EDAC_DIMM_OFF(layers, nlayers, layer0, layer1, layer2) ({ \
> - int __i; \
> - if ((nlayers) == 1) \
> - __i = layer0; \
> - else if ((nlayers) == 2) \
> - __i = (layer1) + ((layers[1]).size * (layer0)); \
> - else if ((nlayers) == 3) \
> - __i = (layer2) + ((layers[2]).size * ((layer1) + \
> - ((layers[1]).size * (layer0)))); \
> - else \
> - __i = -EINVAL; \
> - __i; \
> -})
> -
> struct dimm_info {
> struct device dev;
>
> @@ -412,6 +371,7 @@ struct dimm_info {
> unsigned int location[EDAC_MAX_LAYERS];
>
> struct mem_ctl_info *mci; /* the parent */
> + unsigned int idx; /* index within the parent dimm array */
>
> u32 grain; /* granularity of reported error in bytes */
> enum dev_type dtype; /* memory device type */
> @@ -654,6 +614,9 @@ edac_get_dimm_by_index(struct mem_ctl_info *mci, int index)
> if (index < 0 || index >= mci->tot_dimms)
> return NULL;
>
> + if (WARN_ON_ONCE(mci->dimms[index]->idx != index))
> + return NULL;
> +
> return mci->dimms[index];
> }
>
Cheers,
Mauro
next prev parent reply other threads:[~2019-11-09 7:27 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-06 9:32 [PATCH v2 00/20] EDAC: Rework edac_mc and ghes drivers Robert Richter
2019-11-06 9:33 ` [PATCH v2 01/20] EDAC: Replace EDAC_DIMM_PTR() macro with edac_get_dimm() function Robert Richter
2019-11-09 7:23 ` Mauro Carvalho Chehab
2019-11-06 9:33 ` [PATCH v2 02/20] EDAC: Remove EDAC_DIMM_OFF() macro Robert Richter
2019-11-09 7:27 ` Mauro Carvalho Chehab [this message]
2019-11-06 9:33 ` [PATCH v2 03/20] EDAC: Introduce mci_for_each_dimm() iterator Robert Richter
2019-11-10 11:37 ` Borislav Petkov
2019-11-06 9:33 ` [PATCH v2 04/20] EDAC, mc: Do not BUG_ON() in edac_mc_alloc() Robert Richter
2019-11-06 9:33 ` [PATCH v2 05/20] EDAC, mc: Remove needless zero string termination Robert Richter
2019-11-09 7:28 ` Mauro Carvalho Chehab
2019-11-09 10:11 ` Borislav Petkov
2019-11-06 9:33 ` [PATCH v2 06/20] EDAC, mc: Reduce indentation level in edac_mc_handle_error() Robert Richter
2019-11-06 9:33 ` [PATCH v2 07/20] EDAC, mc: Rename iterator variable to idx Robert Richter
2019-11-09 10:21 ` Borislav Petkov
2019-11-06 9:33 ` [PATCH v2 08/20] EDAC: Remove misleading comment in struct edac_raw_error_desc Robert Richter
2019-11-06 9:33 ` [PATCH v2 09/20] EDAC, ghes: Use standard kernel macros for page calculations Robert Richter
2019-11-06 9:33 ` [PATCH v2 10/20] EDAC, ghes: Fix grain calculation Robert Richter
2019-11-06 9:33 ` [PATCH v2 11/20] EDAC, ghes: Remove intermediate buffer pvt->detail_location Robert Richter
2019-11-06 9:33 ` [PATCH v2 12/20] EDAC, ghes: Unify trace_mc_event() code with edac_mc driver Robert Richter
2019-11-06 9:33 ` [PATCH v2 13/20] EDAC, Documentation: Describe CPER module definition and DIMM ranks Robert Richter
2019-11-06 9:33 ` [PATCH v2 14/20] EDAC, mc: Remove per layer counters Robert Richter
2019-11-09 7:40 ` Mauro Carvalho Chehab
2019-11-18 20:30 ` Robert Richter
2019-11-06 9:33 ` [PATCH v2 15/20] EDAC, mc: Split edac_mc_alloc() into smaller functions Robert Richter
2019-11-06 9:33 ` [PATCH v2 16/20] EDAC, mc: Reorder functions edac_mc_alloc*() Robert Richter
2019-11-06 9:33 ` [PATCH v2 17/20] EDAC, mc: Rework edac_raw_mc_handle_error() to use struct dimm_info Robert Richter
2019-11-06 9:33 ` [PATCH v2 18/20] EDAC: Store error type in struct edac_raw_error_desc Robert Richter
2019-11-09 7:30 ` Mauro Carvalho Chehab
2019-11-06 9:33 ` [PATCH v2 19/20] EDAC, mc: Determine mci pointer from the error descriptor Robert Richter
2019-11-06 9:33 ` [PATCH v2 20/20] EDAC, mc: Create new function edac_inc_csrow() Robert Richter
2019-11-09 7:32 ` Mauro Carvalho Chehab
2019-11-10 14:51 ` [PATCH v2 00/20] EDAC: Rework edac_mc and ghes drivers Borislav Petkov
2019-11-11 15:49 ` Robert Richter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191109082721.73aeac08@kernel.org \
--to=mchehab@kernel.org \
--cc=bp@alien8.de \
--cc=james.morse@arm.com \
--cc=linux-edac@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rrichter@marvell.com \
--cc=tony.luck@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).