Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6e84d359 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

edac_mc: Cleanup per-dimm_info debug messages



The edac_mc_alloc() routine allocates one dimm_info device for all
possible memories, including the non-filled ones. The debug messages
there are somewhat confusing. So, cleans them, by moving the code
that prints the memory location to edac_mc, and using it on both
edac_mc_sysfs and edac_mc.

Also, only dumps information when DIMM/ranks are actually
filled.

After this patch, a dimm-based memory controller will print the debug
info as:

[ 1011.380027] EDAC DEBUG: edac_mc_dump_csrow: csrow->csrow_idx = 0
[ 1011.380029] EDAC DEBUG: edac_mc_dump_csrow:   csrow = ffff8801169be000
[ 1011.380031] EDAC DEBUG: edac_mc_dump_csrow:   csrow->first_page = 0x0
[ 1011.380032] EDAC DEBUG: edac_mc_dump_csrow:   csrow->last_page = 0x0
[ 1011.380034] EDAC DEBUG: edac_mc_dump_csrow:   csrow->page_mask = 0x0
[ 1011.380035] EDAC DEBUG: edac_mc_dump_csrow:   csrow->nr_channels = 3
[ 1011.380037] EDAC DEBUG: edac_mc_dump_csrow:   csrow->channels = ffff8801149c2840
[ 1011.380039] EDAC DEBUG: edac_mc_dump_csrow:   csrow->mci = ffff880117426000
[ 1011.380041] EDAC DEBUG: edac_mc_dump_channel:   channel->chan_idx = 0
[ 1011.380042] EDAC DEBUG: edac_mc_dump_channel:     channel = ffff8801149c2860
[ 1011.380044] EDAC DEBUG: edac_mc_dump_channel:     channel->csrow = ffff8801169be000
[ 1011.380046] EDAC DEBUG: edac_mc_dump_channel:     channel->dimm = ffff88010fe90400
...
[ 1011.380095] EDAC DEBUG: edac_mc_dump_dimm: dimm0: channel 0 slot 0 mapped as virtual row 0, chan 0
[ 1011.380097] EDAC DEBUG: edac_mc_dump_dimm:   dimm = ffff88010fe90400
[ 1011.380099] EDAC DEBUG: edac_mc_dump_dimm:   dimm->label = 'CPU#0Channel#0_DIMM#0'
[ 1011.380101] EDAC DEBUG: edac_mc_dump_dimm:   dimm->nr_pages = 0x40000
[ 1011.380103] EDAC DEBUG: edac_mc_dump_dimm:   dimm->grain = 8
[ 1011.380104] EDAC DEBUG: edac_mc_dump_dimm:   dimm->nr_pages = 0x40000
...

(a rank-based memory controller would print, instead of "dimm?", "rank?"
 on the above debug info)

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 956b9ba1
Loading
Loading
Loading
Loading
+58 −37
Original line number Original line Diff line number Diff line
@@ -42,44 +42,63 @@
static DEFINE_MUTEX(mem_ctls_mutex);
static DEFINE_MUTEX(mem_ctls_mutex);
static LIST_HEAD(mc_devices);
static LIST_HEAD(mc_devices);


unsigned edac_dimm_info_location(struct dimm_info *dimm, char *buf,
			         unsigned len)
{
	struct mem_ctl_info *mci = dimm->mci;
	int i, n, count = 0;
	char *p = buf;

	for (i = 0; i < mci->n_layers; i++) {
		n = snprintf(p, len, "%s %d ",
			      edac_layer_name[mci->layers[i].type],
			      dimm->location[i]);
		p += n;
		len -= n;
		count += n;
		if (!len)
			break;
	}

	return count;
}

#ifdef CONFIG_EDAC_DEBUG
#ifdef CONFIG_EDAC_DEBUG


static void edac_mc_dump_channel(struct rank_info *chan)
static void edac_mc_dump_channel(struct rank_info *chan)
{
{
	edac_dbg(4, "\tchannel = %p\n", chan);
	edac_dbg(4, "  channel->chan_idx = %d\n", chan->chan_idx);
	edac_dbg(4, "\tchannel->chan_idx = %d\n", chan->chan_idx);
	edac_dbg(4, "    channel = %p\n", chan);
	edac_dbg(4, "\tchannel->csrow = %p\n", chan->csrow);
	edac_dbg(4, "    channel->csrow = %p\n", chan->csrow);
	edac_dbg(4, "\tchannel->dimm = %p\n", chan->dimm);
	edac_dbg(4, "    channel->dimm = %p\n", chan->dimm);
}
}


static void edac_mc_dump_dimm(struct dimm_info *dimm)
static void edac_mc_dump_dimm(struct dimm_info *dimm, int number)
{
{
	int i;
	char location[80];


	edac_dbg(4, "\tdimm = %p\n", dimm);
	edac_dimm_info_location(dimm, location, sizeof(location));
	edac_dbg(4, "\tdimm->label = '%s'\n", dimm->label);

	edac_dbg(4, "\tdimm->nr_pages = 0x%x\n", dimm->nr_pages);
	edac_dbg(4, "%s%i: %smapped as virtual row %d, chan %d\n",
	edac_dbg(4, "\tdimm location ");
		 dimm->mci->mem_is_per_rank ? "rank" : "dimm",
	for (i = 0; i < dimm->mci->n_layers; i++) {
		 number, location, dimm->csrow, dimm->cschannel);
		printk(KERN_CONT "%d", dimm->location[i]);
	edac_dbg(4, "  dimm = %p\n", dimm);
		if (i < dimm->mci->n_layers - 1)
	edac_dbg(4, "  dimm->label = '%s'\n", dimm->label);
			printk(KERN_CONT ".");
	edac_dbg(4, "  dimm->nr_pages = 0x%x\n", dimm->nr_pages);
	}
	edac_dbg(4, "  dimm->grain = %d\n", dimm->grain);
	printk(KERN_CONT "\n");
	edac_dbg(4, "  dimm->nr_pages = 0x%x\n", dimm->nr_pages);
	edac_dbg(4, "\tdimm->grain = %d\n", dimm->grain);
	edac_dbg(4, "\tdimm->nr_pages = 0x%x\n", dimm->nr_pages);
}
}


static void edac_mc_dump_csrow(struct csrow_info *csrow)
static void edac_mc_dump_csrow(struct csrow_info *csrow)
{
{
	edac_dbg(4, "\tcsrow = %p\n", csrow);
	edac_dbg(4, "csrow->csrow_idx = %d\n", csrow->csrow_idx);
	edac_dbg(4, "\tcsrow->csrow_idx = %d\n", csrow->csrow_idx);
	edac_dbg(4, "  csrow = %p\n", csrow);
	edac_dbg(4, "\tcsrow->first_page = 0x%lx\n", csrow->first_page);
	edac_dbg(4, "  csrow->first_page = 0x%lx\n", csrow->first_page);
	edac_dbg(4, "\tcsrow->last_page = 0x%lx\n", csrow->last_page);
	edac_dbg(4, "  csrow->last_page = 0x%lx\n", csrow->last_page);
	edac_dbg(4, "\tcsrow->page_mask = 0x%lx\n", csrow->page_mask);
	edac_dbg(4, "  csrow->page_mask = 0x%lx\n", csrow->page_mask);
	edac_dbg(4, "\tcsrow->nr_channels = %d\n", csrow->nr_channels);
	edac_dbg(4, "  csrow->nr_channels = %d\n", csrow->nr_channels);
	edac_dbg(4, "\tcsrow->channels = %p\n", csrow->channels);
	edac_dbg(4, "  csrow->channels = %p\n", csrow->channels);
	edac_dbg(4, "\tcsrow->mci = %p\n", csrow->mci);
	edac_dbg(4, "  csrow->mci = %p\n", csrow->mci);
}
}


static void edac_mc_dump_mci(struct mem_ctl_info *mci)
static void edac_mc_dump_mci(struct mem_ctl_info *mci)
@@ -327,8 +346,6 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
	memset(&pos, 0, sizeof(pos));
	memset(&pos, 0, sizeof(pos));
	row = 0;
	row = 0;
	chn = 0;
	chn = 0;
	edac_dbg(4, "initializing %d %s\n",
		 tot_dimms, per_rank ? "ranks" : "dimms");
	for (i = 0; i < tot_dimms; i++) {
	for (i = 0; i < tot_dimms; i++) {
		chan = mci->csrows[row]->channels[chn];
		chan = mci->csrows[row]->channels[chn];
		off = EDAC_DIMM_OFF(layer, n_layers, pos[0], pos[1], pos[2]);
		off = EDAC_DIMM_OFF(layer, n_layers, pos[0], pos[1], pos[2]);
@@ -341,10 +358,6 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
		mci->dimms[off] = dimm;
		mci->dimms[off] = dimm;
		dimm->mci = mci;
		dimm->mci = mci;


		edac_dbg(2, "%d: %s%i (%d:%d:%d): row %d, chan %d\n",
			 i, per_rank ? "rank" : "dimm", off,
			 pos[0], pos[1], pos[2], row, chn);

		/*
		/*
		 * Copy DIMM location and initialize it.
		 * Copy DIMM location and initialize it.
		 */
		 */
@@ -700,14 +713,22 @@ int edac_mc_add_mc(struct mem_ctl_info *mci)
		int i;
		int i;


		for (i = 0; i < mci->nr_csrows; i++) {
		for (i = 0; i < mci->nr_csrows; i++) {
			struct csrow_info *csrow = mci->csrows[i];
			u32 nr_pages = 0;
			int j;
			int j;


			edac_mc_dump_csrow(mci->csrows[i]);
			for (j = 0; j < csrow->nr_channels; j++)
			for (j = 0; j < mci->csrows[i]->nr_channels; j++)
				nr_pages += csrow->channels[j]->dimm->nr_pages;
				edac_mc_dump_channel(mci->csrows[i]->channels[j]);
			if (!nr_pages)
				continue;
			edac_mc_dump_csrow(csrow);
			for (j = 0; j < csrow->nr_channels; j++)
				if (csrow->channels[j]->dimm->nr_pages)
					edac_mc_dump_channel(csrow->channels[j]);
		}
		}
		for (i = 0; i < mci->tot_dimms; i++)
		for (i = 0; i < mci->tot_dimms; i++)
			edac_mc_dump_dimm(mci->dimms[i]);
			if (mci->dimms[i]->nr_pages)
				edac_mc_dump_dimm(mci->dimms[i], i);
	}
	}
#endif
#endif
	mutex_lock(&mem_ctls_mutex);
	mutex_lock(&mem_ctls_mutex);
+1 −10
Original line number Original line Diff line number Diff line
@@ -485,17 +485,8 @@ static ssize_t dimmdev_location_show(struct device *dev,
				     struct device_attribute *mattr, char *data)
				     struct device_attribute *mattr, char *data)
{
{
	struct dimm_info *dimm = to_dimm(dev);
	struct dimm_info *dimm = to_dimm(dev);
	struct mem_ctl_info *mci = dimm->mci;
	int i;
	char *p = data;

	for (i = 0; i < mci->n_layers; i++) {
		p += sprintf(p, "%s %d ",
			     edac_layer_name[mci->layers[i].type],
			     dimm->location[i]);
	}


	return p - data;
	return edac_dimm_info_location(dimm, data, PAGE_SIZE);
}
}


static ssize_t dimmdev_label_show(struct device *dev,
static ssize_t dimmdev_label_show(struct device *dev,
+3 −0
Original line number Original line Diff line number Diff line
@@ -34,6 +34,9 @@ extern int edac_mc_get_panic_on_ue(void);
extern int edac_get_poll_msec(void);
extern int edac_get_poll_msec(void);
extern int edac_mc_get_poll_msec(void);
extern int edac_mc_get_poll_msec(void);


unsigned edac_dimm_info_location(struct dimm_info *dimm, char *buf,
				 unsigned len);

	/* on edac_device.c */
	/* on edac_device.c */
extern int edac_device_register_sysfs_main_kobj(
extern int edac_device_register_sysfs_main_kobj(
				struct edac_device_ctl_info *edac_dev);
				struct edac_device_ctl_info *edac_dev);