backout previous mem changes. only punt mtrr to rounding if > 1 write-back register
This commit is contained in:
parent
5ff5b9d145
commit
3ff6042aaf
|
@ -16,6 +16,7 @@
|
||||||
#define pageshift(x) ((x) << PAGE_SHIFT)
|
#define pageshift(x) ((x) << PAGE_SHIFT)
|
||||||
|
|
||||||
#define PROC_MEMINFO PROC_FS_ROOT "meminfo"
|
#define PROC_MEMINFO PROC_FS_ROOT "meminfo"
|
||||||
|
#define PROC_MTRR PROC_FS_ROOT "mtrr"
|
||||||
#define PROC_STAT PROC_FS_ROOT "stat"
|
#define PROC_STAT PROC_FS_ROOT "stat"
|
||||||
#define PROC_UPTIME PROC_FS_ROOT "uptime"
|
#define PROC_UPTIME PROC_FS_ROOT "uptime"
|
||||||
#define PROC_LOADAVG PROC_FS_ROOT "loadavg"
|
#define PROC_LOADAVG PROC_FS_ROOT "loadavg"
|
||||||
|
@ -258,6 +259,67 @@ static int is_ht_enabled(sigar_t *sigar)
|
||||||
return sigar->ht_enabled;
|
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 ":")
|
#define MEMINFO_PARAM(a) a ":", SSTRLEN(a ":")
|
||||||
|
|
||||||
static SIGAR_INLINE sigar_uint64_t sigar_meminfo(char *buffer,
|
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?? */
|
mem->shared = SIGAR_FIELD_NOTIMPL; /* XXX where did this go in 2.6?? */
|
||||||
|
|
||||||
|
if (get_ram(sigar, mem) != SIGAR_OK) {
|
||||||
|
/* XXX other options on failure? */
|
||||||
sigar_mem_calc_ram(sigar, mem);
|
sigar_mem_calc_ram(sigar, mem);
|
||||||
|
}
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
int sigar_mem_calc_ram(sigar_t *sigar, sigar_mem_t *mem)
|
||||||
{
|
{
|
||||||
sigar_uint64_t total = (mem->total / (1024 * 1024));
|
sigar_uint64_t lram = (mem->total / (1024 * 1024));
|
||||||
int size = (int)total; /* must cast after division */
|
int ram = (int)lram; /* must cast after division */
|
||||||
int ram;
|
int remainder = ram % 8;
|
||||||
|
|
||||||
for (ram=1; size; size >>= 1) {
|
if (remainder > 0) {
|
||||||
ram <<= 1;
|
ram += (8 - remainder);
|
||||||
}
|
}
|
||||||
|
|
||||||
mem->ram = ram;
|
mem->ram = ram;
|
||||||
|
|
Loading…
Reference in New Issue