[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#750425: libsysfs2: memory leaks detected in libsysfs



Package: libsysfs2
Version: 2.1.0+repack-2
Severity: normal

Dear Maintainer,
*** Please consider answering these questions, where appropriate ***

   * What led up to the situation?
        We wrote an edac-rate daemon which links against libedac which again
        links against libsysfs. The memory usage of the daemon is constantly increasing
        which finally triggers the OOM killer for user jobs
   * What exactly did you do (or not do) that was effective (or
     ineffective)?
        I have to restart the daemon from time to time.
   * What was the outcome of this action?
        The memory usage increased again.
   * What outcome did you expect instead?
        The used memory stays constant.


Here is the valgrind output:

==27455== Memcheck, a memory error detector
==27455== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==27455== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==27455== Command: ./usr/sbin/edac_rate_daemon
==27455== 
==27455== 
==27455== HEAP SUMMARY:
==27455==     in use at exit: 72,464 bytes in 276 blocks
==27455==   total heap usage: 734 allocs, 458 frees, 2,269,558 bytes allocated
==27455== 
==27455== 112 (64 direct, 48 indirect) bytes in 1 blocks are definitely lost in loss record 16 of 42
==27455==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C2E24: dlist_new (dlist.c:102)
==27455==    by 0x53C2ECA: dlist_new_with_delete (dlist.c:124)
==27455==    by 0x53C44CA: sysfs_open_device_tree (sysfs_device.c:252)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x401095: main (edac_rate_daemon.c:99)
==27455== 
==27455== 112 (64 direct, 48 indirect) bytes in 1 blocks are definitely lost in loss record 17 of 42
==27455==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C2E24: dlist_new (dlist.c:102)
==27455==    by 0x53C2ECA: dlist_new_with_delete (dlist.c:124)
==27455==    by 0x53C44CA: sysfs_open_device_tree (sysfs_device.c:252)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x4010BE: main (edac_rate_daemon.c:99)
==27455== 
==27455== 144 bytes in 1 blocks are definitely lost in loss record 18 of 42
==27455==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x4010AD: main (edac_rate_daemon.c:103)
==27455== 
==27455== 144 bytes in 1 blocks are definitely lost in loss record 19 of 42
==27455==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x4010D6: main (edac_rate_daemon.c:103)
==27455== 
==27455== 376 (64 direct, 312 indirect) bytes in 1 blocks are definitely lost in loss record 24 of 42
==27455==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C2E24: dlist_new (dlist.c:102)
==27455==    by 0x53C2ECA: dlist_new_with_delete (dlist.c:124)
==27455==    by 0x53C44CA: sysfs_open_device_tree (sysfs_device.c:252)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x401095: main (edac_rate_daemon.c:99)
==27455== 
==27455== 376 (64 direct, 312 indirect) bytes in 1 blocks are definitely lost in loss record 25 of 42
==27455==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C2E24: dlist_new (dlist.c:102)
==27455==    by 0x53C2ECA: dlist_new_with_delete (dlist.c:124)
==27455==    by 0x53C44CA: sysfs_open_device_tree (sysfs_device.c:252)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x4010BE: main (edac_rate_daemon.c:99)
==27455== 
==27455== 1,056 (768 direct, 288 indirect) bytes in 12 blocks are definitely lost in loss record 28 of 42
==27455==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C2E24: dlist_new (dlist.c:102)
==27455==    by 0x53C2ECA: dlist_new_with_delete (dlist.c:124)
==27455==    by 0x53C44CA: sysfs_open_device_tree (sysfs_device.c:252)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x401095: main (edac_rate_daemon.c:99)
==27455== 
==27455== 1,056 (768 direct, 288 indirect) bytes in 12 blocks are definitely lost in loss record 29 of 42
==27455==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C2E24: dlist_new (dlist.c:102)
==27455==    by 0x53C2ECA: dlist_new_with_delete (dlist.c:124)
==27455==    by 0x53C44CA: sysfs_open_device_tree (sysfs_device.c:252)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x4010BE: main (edac_rate_daemon.c:99)
==27455== 
==27455== 1,912 (600 direct, 1,312 indirect) bytes in 1 blocks are definitely lost in loss record 33 of 42
==27455==    at 0x4C272B8: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C4247: alloc_device (sysfs_device.c:157)
==27455==    by 0x53C4290: sysfs_open_device_path (sysfs_device.c:177)
==27455==    by 0x53C1280: sysfs_read_dir_subdirs (sysfs_attr.c:465)
==27455==    by 0x53C4429: sysfs_open_device_tree (sysfs_device.c:239)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x401095: main (edac_rate_daemon.c:99)
==27455== 
==27455== 1,912 (600 direct, 1,312 indirect) bytes in 1 blocks are definitely lost in loss record 34 of 42
==27455==    at 0x4C272B8: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C4247: alloc_device (sysfs_device.c:157)
==27455==    by 0x53C4290: sysfs_open_device_path (sysfs_device.c:177)
==27455==    by 0x53C1280: sysfs_read_dir_subdirs (sysfs_attr.c:465)
==27455==    by 0x53C4429: sysfs_open_device_tree (sysfs_device.c:239)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x4010BE: main (edac_rate_daemon.c:99)
==27455== 
==27455== 9,376 (1,200 direct, 8,176 indirect) bytes in 2 blocks are definitely lost in loss record 37 of 42
==27455==    at 0x4C272B8: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C4247: alloc_device (sysfs_device.c:157)
==27455==    by 0x53C4290: sysfs_open_device_path (sysfs_device.c:177)
==27455==    by 0x53C1280: sysfs_read_dir_subdirs (sysfs_attr.c:465)
==27455==    by 0x53C4429: sysfs_open_device_tree (sysfs_device.c:239)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x401095: main (edac_rate_daemon.c:99)
==27455== 
==27455== 9,376 (1,200 direct, 8,176 indirect) bytes in 2 blocks are definitely lost in loss record 38 of 42
==27455==    at 0x4C272B8: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C4247: alloc_device (sysfs_device.c:157)
==27455==    by 0x53C4290: sysfs_open_device_path (sysfs_device.c:177)
==27455==    by 0x53C1280: sysfs_read_dir_subdirs (sysfs_attr.c:465)
==27455==    by 0x53C4429: sysfs_open_device_tree (sysfs_device.c:239)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x4010BE: main (edac_rate_daemon.c:99)
==27455== 
==27455== 14,400 bytes in 24 blocks are definitely lost in loss record 40 of 42
==27455==    at 0x4C272B8: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C4247: alloc_device (sysfs_device.c:157)
==27455==    by 0x53C4290: sysfs_open_device_path (sysfs_device.c:177)
==27455==    by 0x53C1280: sysfs_read_dir_subdirs (sysfs_attr.c:465)
==27455==    by 0x53C4429: sysfs_open_device_tree (sysfs_device.c:239)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455== 
==27455== 16,056 (7,800 direct, 8,256 indirect) bytes in 13 blocks are definitely lost in loss record 41 of 42
==27455==    at 0x4C272B8: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C4247: alloc_device (sysfs_device.c:157)
==27455==    by 0x53C4290: sysfs_open_device_path (sysfs_device.c:177)
==27455==    by 0x53C1280: sysfs_read_dir_subdirs (sysfs_attr.c:465)
==27455==    by 0x53C4429: sysfs_open_device_tree (sysfs_device.c:239)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x401095: main (edac_rate_daemon.c:99)
==27455== 
==27455== 16,056 (7,800 direct, 8,256 indirect) bytes in 13 blocks are definitely lost in loss record 42 of 42
==27455==    at 0x4C272B8: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27455==    by 0x53C4247: alloc_device (sysfs_device.c:157)
==27455==    by 0x53C4290: sysfs_open_device_path (sysfs_device.c:177)
==27455==    by 0x53C1280: sysfs_read_dir_subdirs (sysfs_attr.c:465)
==27455==    by 0x53C4429: sysfs_open_device_tree (sysfs_device.c:239)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x53C4485: sysfs_open_device_tree (sysfs_device.c:243)
==27455==    by 0x4E31253: _sysfs_open_device_tree (libedac.c:628)
==27455==    by 0x4E300E3: edac_handle_init (libedac.c:137)
==27455==    by 0x40138B: get_edac_values (edac_rate_daemon.c:365)
==27455==    by 0x402521: update_array (edac_rate_daemon.c:233)
==27455==    by 0x4010BE: main (edac_rate_daemon.c:99)
==27455== 
==27455== LEAK SUMMARY:
==27455==    definitely lost: 35,680 bytes in 86 blocks
==27455==    indirectly lost: 36,784 bytes in 190 blocks
==27455==      possibly lost: 0 bytes in 0 blocks
==27455==    still reachable: 0 bytes in 0 blocks
==27455==         suppressed: 0 bytes in 0 blocks
==27455== 
==27455== For counts of detected and suppressed errors, rerun with: -v
==27455== ERROR SUMMARY: 15 errors from 15 contexts (suppressed: 4 from 4)  
        

and a test code:


/*
 * =====================================================================================
 *
 *       Filename:  edac_daemon.c
 *
 *    Description:  a ce rate monitor running in the background
 *
 *        Version:  1.0
 *        Created:  02/18/2010 09:15:39 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Henning Fehrmann (), henning.fehrmann@aei.mpg.de
 *        Company:  AEI Hannover
 *
 * =====================================================================================
 */


#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <edac.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include "uthash.h"
#include <sys/resource.h>

#define RUNNING_DIR	"/tmp"
#define LOCK_FILE	"/var/run/edac_rate_daemon.lock"
#define LOG_FILE	"/tmp/edac_rate.log"
#define BUF 48
#define CNT_5MIN 5
#define CNT_1H 17
#define CNT_1D 41
#define CNT_7D 48
#define BANKS 32
#define RANGE_5MIN 300
#define RANGE_1H 3600
#define RANGE_1D 86400
#define RANGE_7D 604800

unsigned int UE_cnt=0;


struct DIMM_struct {
	int id;
	char slot[32];
	unsigned int CEcnt;
	unsigned int * CEarray;
	float * CErates;
	unsigned int * timearray;
	int UEcnt;
	UT_hash_handle hh;
};

struct DIMM_struct * dimms;


/* sleep time */
int sleeptime=1;
time_t start_time;

typedef struct list * List;

struct prog_ctx {
	char *progname;
	struct edac_handle *edac;
	int verbose;
	int quiet;
	int print_status;
	List reports;
};


void daemonize();
void update_array();
void get_rate();
void log_message( char * filename, char * message);
void signal_handler( int sig);
void publish_rate();
static void get_edac_values ();

// int main()
int main()
{
//	daemonize();
	int i;
	start_time = time(NULL);
	//dimms = (struct DIMM_struct *) malloc ( BANKS * sizeof ( struct DIMM_struct )) ;
	dimms = NULL;

	for (i=0; i<2; i++)
	{
		update_array();
		get_rate();
		publish_rate();
//		sleep(sleeptime);
		struct rusage* memory = malloc(sizeof(struct rusage));
		getrusage(RUSAGE_SELF, memory);
//		printf("Usage: %ld\n", memory->ru_ixrss);
//		printf("Usage: %ld\n", memory->ru_isrss);
//		printf("Usage: %ld\n", memory->ru_idrss);
	//	printf("Max: %ld\n", memory->ru_maxrss);	
	
	}

	struct DIMM_struct * dimm, *tmp;
	HASH_ITER(hh, dimms, dimm, tmp) {
		free(dimm->CEarray);
		free(dimm->timearray);
		free(dimm->CErates);
		HASH_DEL(dimms, dimm);
		free(dimm);
	}
	free(dimms);


	return 0;
}
// }}}

void publish_rate()
{
	FILE * f;
	struct DIMM_struct * dimm, *tmp;
	if((f=fopen("/tmp/edac_rate_array_debug","w"))==NULL) {
		log_message(LOG_FILE,"could not open file ");
		exit(0);
		return;
	}
	HASH_ITER(hh, dimms, dimm, tmp) {
		fprintf(f,"%s\t%f\t%f\t%f\t%f\tCE[mHz]: 5min,1h,1d,7d\n",
			dimm->slot,dimm->CErates[0],dimm->CErates[1],dimm->CErates[2],dimm->CErates[3]);
	}
	
	if (UE_cnt != 0){
		fprintf(f,"UE: %u\n",UE_cnt);
	}
//	fprintf(stdout,"%f\t%f\t%f\t%f\n",rate_5min,rate_1h,rate_1d,rate_7d);
	fclose(f);
}

void get_rate()
{
	unsigned int CE_d_5min;
	unsigned int time_d_5min;
	unsigned int CE_d_1h;
	unsigned int time_d_1h;
	unsigned int CE_d_1d;
	unsigned int time_d_1d;
	unsigned int CE_d_7d;
	unsigned int time_d_7d;
	
	struct DIMM_struct * dimm, *tmp;

	HASH_ITER(hh, dimms, dimm, tmp) {
		if (dimm->timearray[CNT_5MIN-1]==start_time){
			continue;
		}
		time_d_5min=dimm->timearray[0]-dimm->timearray[CNT_5MIN-1];
		//printf("update now\n");
		CE_d_5min=dimm->CEarray[0]-dimm->CEarray[CNT_5MIN-1];
		dimm->CErates[0]=1000.*(float)CE_d_5min/(float)time_d_5min;

		if (dimm->timearray[CNT_1H -1 ]==start_time){
			continue;
		}
		time_d_1h=dimm->timearray[0]-dimm->timearray[CNT_1H -1 ];
		CE_d_1h=dimm->CEarray[0]-dimm->CEarray[CNT_1H - 1];
		dimm->CErates[1]=1000.*(float)CE_d_1h/(float)time_d_1h;

		if (dimm->timearray[CNT_1D -1 ]==start_time){
			continue;
		}

		time_d_1d=dimm->timearray[0]-dimm->timearray[CNT_1D -1 ];
		CE_d_1d=dimm->CEarray[0]-dimm->CEarray[CNT_1D -1 ];
		dimm->CErates[2]=1000.*(float)CE_d_1d/(float)time_d_1d;

		if (dimm->timearray[CNT_7D -1 ]==start_time){
			continue;
		}

		time_d_7d=dimm->timearray[0]-dimm->timearray[CNT_7D-1];
		CE_d_7d=dimm->CEarray[0]-dimm->CEarray[CNT_7D-1];
		dimm->CErates[3]=1000.*(float)CE_d_7d/(float)time_d_7d;
	}
}

void daemonize()
{
int i,lfp;
char str[10];
	if(getppid()==1) return; /* already a daemon */
	i=fork();
	if (i<0) exit(1); /* fork error */
	if (i>0) exit(0); /* parent exits */
	/* child (daemon) continues */
	setsid(); /* obtain a new process group */
	for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */
	i=open("/dev/null",O_RDWR); dup(i); dup(i); /* handle standart I/O */
	umask(027); /* set newly created file permissions */
	chdir(RUNNING_DIR); /* change running directory */
	lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
	if (lfp<0) exit(1); /* can not open */
	if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */
	/* first instance continues */
	sprintf(str,"%d\n",getpid());
	write(lfp,str,strlen(str)); /* record pid to lockfile */
	signal(SIGCHLD,SIG_IGN); /* ignore child */
	signal(SIGTSTP,SIG_IGN); /* ignore tty signals */
	signal(SIGTTOU,SIG_IGN);
	signal(SIGTTIN,SIG_IGN);
	signal(SIGHUP,signal_handler); /* catch hangup signal */
	signal(SIGTERM,signal_handler); /* catch kill signal */
}

void update_array()
{
	int i;
	time_t now = time(NULL);
	unsigned int time_tmp1;
	unsigned int time_tmp2;
	unsigned int CE_tmp1;
	unsigned int CE_tmp2;
	struct DIMM_struct * dimm, *tmp;

	get_edac_values();
	
	//HASH_ITER(hh, dimms, dimm, tmp) {
	//	if(dimm) printf("%s id is %d %d\n", dimm->slot,dimm->id,dimm->CEcnt);
	//}
	

	HASH_ITER(hh, dimms, dimm, tmp) {
		time_tmp1=dimm->timearray[0];
		CE_tmp1=dimm->CEarray[0];
		dimm->timearray[0]=(uint)now;
		dimm->CEarray[0]=dimm->CEcnt;
		/* do the first 5 minutes */
		for (i=1; i< CNT_5MIN; i++ ){
			time_tmp2=dimm->timearray[i];
			CE_tmp2=dimm->CEarray[i];

			dimm->timearray[i]=time_tmp1;
			dimm->CEarray[i]=CE_tmp1;

			time_tmp1=time_tmp2;
			CE_tmp1=CE_tmp2;
		}
		if ( time_tmp1-dimm->timearray[CNT_5MIN]< RANGE_5MIN){
			/* do not touch the next array segments */
			continue;
		}
		for (i=CNT_5MIN; i< CNT_1H; i++ ){
			time_tmp2=dimm->timearray[i];
			CE_tmp2=dimm->CEarray[i];

			dimm->timearray[i]=time_tmp1;
			dimm->CEarray[i]=CE_tmp1;

			time_tmp1=time_tmp2;
			CE_tmp1=CE_tmp2;
		}

		if ( time_tmp1-dimm->timearray[CNT_1H]< RANGE_1H){
			/* do not touch the next array segments */
			continue;
		}
		for (i=CNT_1H; i< CNT_1D; i++ ){
			time_tmp2 = dimm->timearray[i];
			CE_tmp2= dimm->CEarray[i];

			dimm->timearray[i]=time_tmp1;
			dimm->CEarray[i]=CE_tmp1;

			time_tmp1=time_tmp2;
			CE_tmp1=CE_tmp2;
		}
		if (  time_tmp1-dimm->timearray[CNT_1D]< RANGE_1D){
			/* do not touch the next array segments */
			continue;
		}
		for (i=CNT_1D; i< CNT_7D; i++ ){
			time_tmp2=dimm->timearray[i];
			CE_tmp2=dimm->CEarray[i];

			dimm->timearray[i]=time_tmp1;
			dimm->CEarray[i]=CE_tmp1;

			time_tmp1=time_tmp2;
			CE_tmp1=CE_tmp2;
		}
	}
}

void log_message(filename,message)
char *filename;
char *message;
{
	FILE *logfile;
	logfile=fopen(filename,"a");
	if(!logfile) return;
	fprintf(logfile,"%s\n",message);
	fclose(logfile);
}

void signal_handler(sig)
int sig;
{
	struct DIMM_struct * dimm, *tmp;
	switch(sig) {
	case SIGHUP:
		HASH_ITER(hh, dimms, dimm, tmp) {
			free(dimm->CEarray);
			free(dimm->timearray);
			free(dimm->CErates);
			HASH_DEL(dimms, dimm);
			free(dimm);
		}
		free(dimms);

		log_message(LOG_FILE,"hangup signal catched");
		break;
	case SIGTERM:
		HASH_ITER(hh, dimms, dimm, tmp) {
			free(dimm->CEarray);
			free(dimm->timearray);
			free(dimm->CErates);
			HASH_DEL(dimms, dimm);
			free(dimm);
		}
		free(dimms);
		log_message(LOG_FILE,"terminate signal catched");
		exit(0);
		break;
	}
}

static void get_edac_values ()
{
	edac_mc *mc;
	edac_csrow *csrow;
	struct DIMM_struct * dimm;
	struct edac_mc_info mci;
	struct edac_csrow_info csi;
	int i,j;
	int id=0;
	char slot[32];
	struct edac_handle *edac;
	
	static struct prog_ctx prog_ctx = { "report", NULL, 0, 0, 0, NULL }; 

		
	if (!(edac = edac_handle_create ())) {
		fprintf (stderr, "edac_handle_create: Out of memory!\n");
		exit (1);
	}

	if (edac_handle_init (edac) < 0) {
		fprintf (stderr, "Unable to get EDAC data: %s\n",
			    edac_strerror (edac));
        	edac_handle_destroy (edac);
		exit (1);
	}
	prog_ctx.edac=edac;
	edac_for_each_mc_info (prog_ctx.edac, mc, mci) {
		edac_for_each_csrow_info (mc, csrow, csi) {

			for (i = 0; i < EDAC_MAX_CHANNELS; i++) {
			    struct edac_channel *ch = &csi.channel[i];

				if (!ch->valid)
					continue;
			
				sprintf(slot,"%s:%s:%s",mci.id, csi.id, ch->dimm_label);
				HASH_FIND_STR( dimms, slot, dimm);
				if (!dimm){
					dimm = (struct DIMM_struct *) malloc(sizeof( struct DIMM_struct));
					dimm->id	= id++;
					dimm->CEcnt	= ch->ce_count;
					dimm->CEarray 	= (unsigned int *) malloc (sizeof(unsigned int)* BUF);
					dimm->timearray	= (unsigned int *) malloc (sizeof(unsigned int)* BUF);
					dimm->CErates 	= (float *) malloc (sizeof(float )* 4);
					for (j=0; j<BUF; j++){
						dimm->CEarray[j]=0.;
						dimm->timearray[j]=start_time;
					}
					for (j=0; j<4; j++) dimm->CErates[j]=0.;
					strcpy(dimm->slot,slot);
					HASH_ADD_STR( dimms, slot, dimm );
				}else{
					dimm->CEcnt	= ch->ce_count ;
				}
			}
		}
	}

        edac_handle_destroy (edac);
	return;
}



-- System Information:
Debian Release: 7.5
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.12.18-atlas (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=de_DE@euro (charmap=UTF-8) (ignored: LC_ALL set to de_DE.utf-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages libsysfs2 depends on:
ii  libc6              2.13-38+deb7u1
ii  multiarch-support  2.13-38+deb7u1

libsysfs2 recommends no packages.

libsysfs2 suggests no packages.

-- no debconf information


Reply to: