Messages in this thread Patch in this message | | | Date | Fri, 11 Oct 2019 07:45:38 -0300 | From | Mauro Carvalho Chehab <> | Subject | Re: [PATCH 09/19] EDAC, mc: Reorder functions edac_mc_alloc*() |
| |
Em Thu, 10 Oct 2019 20:25:22 +0000 Robert Richter <rrichter@marvell.com> escreveu:
> Reorder the new created functions edac_mc_alloc_csrows() and > edac_mc_alloc_dimms() and move them before edac_mc_alloc(). No further > code changes. > > Signed-off-by: Robert Richter <rrichter@marvell.com>
Reviewed-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
> --- > drivers/edac/edac_mc.c | 171 ++++++++++++++++++++--------------------- > 1 file changed, 84 insertions(+), 87 deletions(-) > > diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c > index 0db504cb3419..6d880cf4d599 100644 > --- a/drivers/edac/edac_mc.c > +++ b/drivers/edac/edac_mc.c > @@ -305,93 +305,6 @@ static void _edac_mc_free(struct mem_ctl_info *mci) > kfree(mci); > } > > -static int edac_mc_alloc_csrows(struct mem_ctl_info *mci); > -static int edac_mc_alloc_dimms(struct mem_ctl_info *mci); > - > -struct mem_ctl_info *edac_mc_alloc(unsigned int mc_num, > - unsigned int n_layers, > - struct edac_mc_layer *layers, > - unsigned int sz_pvt) > -{ > - struct mem_ctl_info *mci; > - struct edac_mc_layer *layer; > - unsigned int idx, size, tot_dimms = 1; > - unsigned int tot_csrows = 1, tot_channels = 1; > - void *pvt, *ptr = NULL; > - bool per_rank = false; > - > - if (WARN_ON(n_layers > EDAC_MAX_LAYERS || n_layers == 0)) > - return NULL; > - > - /* > - * Calculate the total amount of dimms and csrows/cschannels while > - * in the old API emulation mode > - */ > - for (idx = 0; idx < n_layers; idx++) { > - tot_dimms *= layers[idx].size; > - if (layers[idx].is_virt_csrow) > - tot_csrows *= layers[idx].size; > - else > - tot_channels *= layers[idx].size; > - > - if (layers[idx].type == EDAC_MC_LAYER_CHIP_SELECT) > - per_rank = true; > - } > - > - /* Figure out the offsets of the various items from the start of an mc > - * structure. We want the alignment of each item to be at least as > - * stringent as what the compiler would provide if we could simply > - * hardcode everything into a single struct. > - */ > - mci = edac_align_ptr(&ptr, sizeof(*mci), 1); > - layer = edac_align_ptr(&ptr, sizeof(*layer), n_layers); > - pvt = edac_align_ptr(&ptr, sz_pvt, 1); > - size = ((unsigned long)pvt) + sz_pvt; > - > - edac_dbg(1, "allocating %u bytes for mci data (%d %s, %d csrows/channels)\n", > - size, > - tot_dimms, > - per_rank ? "ranks" : "dimms", > - tot_csrows * tot_channels); > - > - mci = kzalloc(size, GFP_KERNEL); > - if (mci == NULL) > - return NULL; > - > - /* Adjust pointers so they point within the memory we just allocated > - * rather than an imaginary chunk of memory located at address 0. > - */ > - layer = (struct edac_mc_layer *)(((char *)mci) + ((unsigned long)layer)); > - pvt = sz_pvt ? (((char *)mci) + ((unsigned long)pvt)) : NULL; > - > - /* setup index and various internal pointers */ > - mci->mc_idx = mc_num; > - mci->tot_dimms = tot_dimms; > - mci->pvt_info = pvt; > - mci->n_layers = n_layers; > - mci->layers = layer; > - memcpy(mci->layers, layers, sizeof(*layer) * n_layers); > - mci->nr_csrows = tot_csrows; > - mci->num_cschannel = tot_channels; > - mci->csbased = per_rank; > - > - if (edac_mc_alloc_csrows(mci)) > - goto error; > - > - if (edac_mc_alloc_dimms(mci)) > - goto error; > - > - mci->op_state = OP_ALLOC; > - > - return mci; > - > -error: > - _edac_mc_free(mci); > - > - return NULL; > -} > -EXPORT_SYMBOL_GPL(edac_mc_alloc); > - > static int edac_mc_alloc_csrows(struct mem_ctl_info *mci) > { > unsigned int tot_csrows = mci->nr_csrows; > @@ -520,6 +433,90 @@ static int edac_mc_alloc_dimms(struct mem_ctl_info *mci) > return 0; > } > > +struct mem_ctl_info *edac_mc_alloc(unsigned int mc_num, > + unsigned int n_layers, > + struct edac_mc_layer *layers, > + unsigned int sz_pvt) > +{ > + struct mem_ctl_info *mci; > + struct edac_mc_layer *layer; > + unsigned int idx, size, tot_dimms = 1; > + unsigned int tot_csrows = 1, tot_channels = 1; > + void *pvt, *ptr = NULL; > + bool per_rank = false; > + > + if (WARN_ON(n_layers > EDAC_MAX_LAYERS || n_layers == 0)) > + return NULL; > + > + /* > + * Calculate the total amount of dimms and csrows/cschannels while > + * in the old API emulation mode > + */ > + for (idx = 0; idx < n_layers; idx++) { > + tot_dimms *= layers[idx].size; > + if (layers[idx].is_virt_csrow) > + tot_csrows *= layers[idx].size; > + else > + tot_channels *= layers[idx].size; > + > + if (layers[idx].type == EDAC_MC_LAYER_CHIP_SELECT) > + per_rank = true; > + } > + > + /* Figure out the offsets of the various items from the start of an mc > + * structure. We want the alignment of each item to be at least as > + * stringent as what the compiler would provide if we could simply > + * hardcode everything into a single struct. > + */ > + mci = edac_align_ptr(&ptr, sizeof(*mci), 1); > + layer = edac_align_ptr(&ptr, sizeof(*layer), n_layers); > + pvt = edac_align_ptr(&ptr, sz_pvt, 1); > + size = ((unsigned long)pvt) + sz_pvt; > + > + edac_dbg(1, "allocating %u bytes for mci data (%d %s, %d csrows/channels)\n", > + size, > + tot_dimms, > + per_rank ? "ranks" : "dimms", > + tot_csrows * tot_channels); > + > + mci = kzalloc(size, GFP_KERNEL); > + if (mci == NULL) > + return NULL; > + > + /* Adjust pointers so they point within the memory we just allocated > + * rather than an imaginary chunk of memory located at address 0. > + */ > + layer = (struct edac_mc_layer *)(((char *)mci) + ((unsigned long)layer)); > + pvt = sz_pvt ? (((char *)mci) + ((unsigned long)pvt)) : NULL; > + > + /* setup index and various internal pointers */ > + mci->mc_idx = mc_num; > + mci->tot_dimms = tot_dimms; > + mci->pvt_info = pvt; > + mci->n_layers = n_layers; > + mci->layers = layer; > + memcpy(mci->layers, layers, sizeof(*layer) * n_layers); > + mci->nr_csrows = tot_csrows; > + mci->num_cschannel = tot_channels; > + mci->csbased = per_rank; > + > + if (edac_mc_alloc_csrows(mci)) > + goto error; > + > + if (edac_mc_alloc_dimms(mci)) > + goto error; > + > + mci->op_state = OP_ALLOC; > + > + return mci; > + > +error: > + _edac_mc_free(mci); > + > + return NULL; > +} > +EXPORT_SYMBOL_GPL(edac_mc_alloc); > + > void edac_mc_free(struct mem_ctl_info *mci) > { > edac_dbg(1, "\n");
Thanks, Mauro
| |