Message ID | 20191010202418.25098-10-rrichter@marvell.com |
---|---|
State | Superseded |
Headers | show |
Series | EDAC: Rework edac_mc and ghes drivers | expand |
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
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");
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> --- drivers/edac/edac_mc.c | 171 ++++++++++++++++++++--------------------- 1 file changed, 84 insertions(+), 87 deletions(-) -- 2.20.1