backout previous mem changes. only punt mtrr to rounding if > 1 write-back register

This commit is contained in:
Doug MacEachern 2006-06-13 15:38:43 +00:00
parent 5ff5b9d145
commit 3ff6042aaf
2 changed files with 71 additions and 6 deletions

View File

@ -16,6 +16,7 @@
#define pageshift(x) ((x) << PAGE_SHIFT)
#define PROC_MEMINFO PROC_FS_ROOT "meminfo"
#define PROC_MTRR PROC_FS_ROOT "mtrr"
#define PROC_STAT PROC_FS_ROOT "stat"
#define PROC_UPTIME PROC_FS_ROOT "uptime"
#define PROC_LOADAVG PROC_FS_ROOT "loadavg"
@ -258,6 +259,67 @@ static int is_ht_enabled(sigar_t *sigar)
return sigar->ht_enabled;
}
static int get_ram(sigar_t *sigar, sigar_mem_t *mem)
{
char buffer[BUFSIZ], *ptr;
FILE *fp;
int total = 0;
if (sigar->ram > 0) {
/* return cached value */
mem->ram = sigar->ram;
return SIGAR_OK;
}
if (sigar->ram == 0) {
return ENOENT;
}
/*
* Memory Type Range Registers
* write-back registers add up to the total.
* Well, they are supposed to add up, but seen
* at least one configuration where that is not the
* case.
*/
if (!(fp = fopen(PROC_MTRR, "r"))) {
return errno;
}
while ((ptr = fgets(buffer, sizeof(buffer), fp))) {
if (!(ptr = strstr(ptr, "size="))) {
continue;
}
if (!strstr(ptr, "write-back")) {
continue;
}
if (total) {
/* punt if there is more than 1 write-back register */
total = 0;
break;
}
ptr += 5;
while (sigar_isspace(*ptr)) {
++ptr;
}
total = atoi(ptr);
}
fclose(fp);
if (total == 0) {
return ENOENT;
}
mem->ram = sigar->ram = total;
return SIGAR_OK;
}
#define MEMINFO_PARAM(a) a ":", SSTRLEN(a ":")
static SIGAR_INLINE sigar_uint64_t sigar_meminfo(char *buffer,
@ -308,7 +370,10 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem)
mem->shared = SIGAR_FIELD_NOTIMPL; /* XXX where did this go in 2.6?? */
sigar_mem_calc_ram(sigar, mem);
if (get_ram(sigar, mem) != SIGAR_OK) {
/* XXX other options on failure? */
sigar_mem_calc_ram(sigar, mem);
}
return SIGAR_OK;
}

View File

@ -312,12 +312,12 @@ int sigar_proc_count(sigar_t *sigar, sigar_uint64_t *total)
int sigar_mem_calc_ram(sigar_t *sigar, sigar_mem_t *mem)
{
sigar_uint64_t total = (mem->total / (1024 * 1024));
int size = (int)total; /* must cast after division */
int ram;
sigar_uint64_t lram = (mem->total / (1024 * 1024));
int ram = (int)lram; /* must cast after division */
int remainder = ram % 8;
for (ram=1; size; size >>= 1) {
ram <<= 1;
if (remainder > 0) {
ram += (8 - remainder);
}
mem->ram = ram;