[PATCH skeleton v7 15/21] Fix memory leak
OpenBMC Patches
openbmc-patches at stwcx.xyz
Mon May 9 19:30:48 AEST 2016
From: johnhcwang <hsienchiang at gmail.com>
1. Multi-processes if we call fan_algorithm.py every HOST_POWERED state
2. Occupy the memory if we don't unref sdbus message
---
bin/Barreleye.py | 2 +-
objects/fan_algorithm.c | 615 ++++++++++++++++++++++--------------------------
objects/info.c | 558 +++++++++++++++++++++----------------------
3 files changed, 542 insertions(+), 633 deletions(-)
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index 6e8a8a4..e05d985 100755
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -212,7 +212,7 @@ APPS = {
'process_name' : 'info',
},
'fan_algorithm' : {
- 'system_state' : 'HOST_POWERED_ON',
+ 'system_state' : 'BMC_READY',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'fan_algorithm',
diff --git a/objects/fan_algorithm.c b/objects/fan_algorithm.c
index 477b7cb..1077d55 100755
--- a/objects/fan_algorithm.c
+++ b/objects/fan_algorithm.c
@@ -92,7 +92,6 @@ const char *gIntPath = "org.openbmc.SensorValue";
char *gMessage = NULL;
-sd_bus *bus = NULL;
#define MAX_BYTES 255
@@ -126,73 +125,72 @@ int Openloopspeed = 0;
int Closeloopspeed = 0;
int Finalfanspeed = 0;
-static int i2c_open() {
- int fd;
- char fn[32];
- int rc;
-
- g_bus = 6;
- snprintf(fn, sizeof(fn), "/dev/i2c-%d", g_bus);
- fd = open(fn, O_RDWR);
- if (fd == -1) {
- LOG_ERR(errno, "Failed to open i2c device %s", fn);
- close(fd);
- return -1;
- }
- return fd;
+static int i2c_open()
+{
+ int rc = 0, fd = -1;
+ char fn[32];
+
+ g_bus = 6;
+ snprintf(fn, sizeof(fn), "/dev/i2c-%d", g_bus);
+ fd = open(fn, O_RDWR);
+ if (fd == -1) {
+ LOG_ERR(errno, "Failed to open i2c device %s", fn);
+ close(fd);
+ return -1;
+ }
+ return fd;
}
-static int SetFanLed(int fd,int color) {
- struct i2c_rdwr_ioctl_data data;
- struct i2c_msg msg[2];
- int n_msg = 0;
- int rc;
-
- memset(&msg, 0, sizeof(msg));
-
- g_slave_addr = 0x20;
- g_use_pec = 0;
- g_n_write = 2;
-
- if(color==1) //blue light
- {
- g_write_bytes[0] = 0x03;
- g_write_bytes[1] = 0x55;
- g_write_color_bytes[0] = 0x02;
- g_write_color_bytes[1] = 0xaa;
- }
- else //red light
- {
- g_write_bytes[0] = 0x03;
- g_write_bytes[1] = 0xaa;
- g_write_color_bytes[0] = 0x02;
- g_write_color_bytes[1] = 0x55;
- }
+static int SetFanLed(int fd,int color)
+{
+ struct i2c_rdwr_ioctl_data data;
+ struct i2c_msg msg[2];
+ int rc = 0, n_msg = 0;
+
+ memset(&msg, 0, sizeof(msg));
+
+ g_slave_addr = 0x20;
+ g_use_pec = 0;
+ g_n_write = 2;
+
+ if(color == 1) {
+ //blue light
+ g_write_bytes[0] = 0x03;
+ g_write_bytes[1] = 0x55;
+ g_write_color_bytes[0] = 0x02;
+ g_write_color_bytes[1] = 0xaa;
+ } else {
+ //red light
+ g_write_bytes[0] = 0x03;
+ g_write_bytes[1] = 0xaa;
+ g_write_color_bytes[0] = 0x02;
+ g_write_color_bytes[1] = 0x55;
+ }
- if (1) {
- msg[n_msg].addr = g_slave_addr;
- msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0;
- msg[n_msg].len = g_n_write;
- msg[n_msg].buf = g_write_bytes;
- n_msg++;
- }
- if (1) {
- msg[n_msg].addr = g_slave_addr;
- msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0;
- msg[n_msg].len = g_n_write;
- msg[n_msg].buf = g_write_color_bytes;
- n_msg++;
- }
- data.msgs = msg;
- data.nmsgs = n_msg;
- rc = ioctl(fd, I2C_RDWR, &data);
- if (rc < 0) {
- LOG_ERR(errno, "Failed to do raw io");
- close(fd);
- return -1;
- }
-
- return 0;
+ if (1) {
+ msg[n_msg].addr = g_slave_addr;
+ msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0;
+ msg[n_msg].len = g_n_write;
+ msg[n_msg].buf = g_write_bytes;
+ n_msg++;
+ }
+ if (1) {
+ msg[n_msg].addr = g_slave_addr;
+ msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0;
+ msg[n_msg].len = g_n_write;
+ msg[n_msg].buf = g_write_color_bytes;
+ n_msg++;
+ }
+ data.msgs = msg;
+ data.nmsgs = n_msg;
+ rc = ioctl(fd, I2C_RDWR, &data);
+ if (rc < 0) {
+ LOG_ERR(errno, "Failed to do raw io");
+ close(fd);
+ return -1;
+ }
+
+ return 0;
}
@@ -218,76 +216,63 @@ int CloseLoop (int cpureading,int dimmreading)
static int DIMM_differential_error = 0;
static int DIMM_last_error = 0;
-//CPU closeloop
-CPU_tracking_error = cpureading - g_CPUVariable;
-Interal_CPU_Err[intergral_i]=CPU_tracking_error;
-CPU_integral_error = 0;
-for(i=0;i<g_Sampling_N;i++)
-{
- CPU_integral_error += Interal_CPU_Err[i] ;
-}
+ //CPU closeloop
+ CPU_tracking_error = cpureading - g_CPUVariable;
+ Interal_CPU_Err[intergral_i] = CPU_tracking_error;
+ CPU_integral_error = 0;
-CPU_differential_error = CPU_tracking_error - CPU_last_error;
-CPU_PID_value = g_Kp * CPU_tracking_error + g_Ki * CPU_integral_error + g_Kd * CPU_differential_error;
+ for(i=0;i<g_Sampling_N;i++)
+ CPU_integral_error += Interal_CPU_Err[i] ;
-CPU_PWM_speed= CPU_PID_value + g_fanspeed;
-if(CPU_PWM_speed > 100)
-{
- CPU_PWM_speed = 100;
-}
-if(CPU_PWM_speed < 0)
-{
- CPU_PWM_speed = 0;
-}
+ CPU_differential_error = CPU_tracking_error - CPU_last_error;
+ CPU_PID_value = g_Kp * CPU_tracking_error + g_Ki * CPU_integral_error + g_Kd * CPU_differential_error;
+ CPU_PWM_speed = CPU_PID_value + g_fanspeed;
-CPU_last_error = CPU_tracking_error;
+ if(CPU_PWM_speed > 100)
+ CPU_PWM_speed = 100;
+ if(CPU_PWM_speed < 0)
+ CPU_PWM_speed = 0;
-//DIMM closeloop
+ CPU_last_error = CPU_tracking_error;
+ //DIMM closeloop
DIMM_tracking_error = dimmreading - g_DIMMVariable;
- Interal_DIMM_Err[intergral_i]=DIMM_tracking_error;
- intergral_i++;
- DIMM_integral_error = 0;
- for(i=0;i<g_Sampling_N;i++)
- {
- DIMM_integral_error += Interal_DIMM_Err[i] ;
- }
- if(intergral_i == g_Sampling_N)
- intergral_i = 0;
+ Interal_DIMM_Err[intergral_i] = DIMM_tracking_error;
+ intergral_i++;
+ DIMM_integral_error = 0;
+
+ for(i=0;i<g_Sampling_N;i++)
+ DIMM_integral_error += Interal_DIMM_Err[i] ;
+
+ if(intergral_i == g_Sampling_N)
+ intergral_i = 0;
DIMM_differential_error = DIMM_tracking_error - DIMM_last_error;
- DIMM_PID_value = g_Kp * DIMM_tracking_error + g_Ki * DIMM_integral_error + g_Kd * DIMM_differential_error;
- DIMM_PWM_speed = DIMM_PID_value + g_fanspeed;
+ DIMM_PID_value = g_Kp * DIMM_tracking_error + g_Ki * DIMM_integral_error + g_Kd * DIMM_differential_error;
+ DIMM_PWM_speed = DIMM_PID_value + g_fanspeed;
- if(DIMM_PWM_speed > 100)
- {
- DIMM_PWM_speed = 100;
- }
- if(DIMM_PWM_speed < 0)
- {
- DIMM_PWM_speed = 0;
- }
+ if(DIMM_PWM_speed > 100)
+ DIMM_PWM_speed = 100;
+
+ if(DIMM_PWM_speed < 0)
+ DIMM_PWM_speed = 0;
DIMM_last_error = DIMM_tracking_error;
- if (DIMM_PWM_speed>CPU_PWM_speed)
- Closeloopspeed=DIMM_PWM_speed;
+ if (DIMM_PWM_speed > CPU_PWM_speed)
+ Closeloopspeed = DIMM_PWM_speed;
else
- Closeloopspeed=CPU_PWM_speed;
+ Closeloopspeed = CPU_PWM_speed;
if(intergral_i == g_Sampling_N)
intergral_i = 0;
-
-
}
int OpenLoop (int sensorreading)
{
-
-
int speed = 0;
float paramA= 0;
float paramB= 2;
@@ -295,268 +280,220 @@ int OpenLoop (int sensorreading)
int Low_Amb = 20;
int Up_Amb = 40;
- if (sensorreading >= Up_Amb)
- {
- speed = 100;
- //printf("## Ambient >=%dC, the Fan duty is %d \n",Up_Amb,speed);
- }
- else if (sensorreading <= Low_Amb)
- {
- speed = 40;
- //printf("## Ambient <=%dC, the Fan duty is %d \n",Low_Amb,speed);
- }
- else
- {
+ if (sensorreading >= Up_Amb) {
+ speed = 100;
+// printf("## Ambient >=%dC, the Fan duty is %d \n",Up_Amb,speed);
+ } else if (sensorreading <= Low_Amb) {
+ speed = 40;
+// printf("## Ambient <=%dC, the Fan duty is %d \n",Low_Amb,speed);
+ } else {
speed = ( paramA * sensorreading * sensorreading ) + ( paramB * sensorreading ) + paramC;
+
if(speed > 100)
- {
speed = 100;
- }
+
if(speed < 40)
- {
speed = 40;
- }
- // printf("The Fan duty is %d \n",speed);
-
+// printf("The Fan duty is %d \n",speed);
}
- Openloopspeed=speed;
+ Openloopspeed = speed;
-return 0;
+ return 0;
}
-
-
-int Fan_control_algorithm(void) {
-
- sd_bus *bus;
- sd_bus_slot *slot;
- int r, Ambient_reading, rc,retry,i;
+int Fan_control_algorithm(void)
+{
+ sd_bus *bus = NULL;
+ sd_bus_error bus_error = SD_BUS_ERROR_NULL;
+ sd_bus_message *response = NULL;
+ int Ambient_reading = 0, rc = 0, i = 0;
int CPU0_core_temperature[12];
int CPU1_core_temperature[12];
int DIMM_temperature[32];
int HighestCPUtemp = 0;
int HighestDIMMtemp = 0;
int CPUnocore[2];
- int fd;
+ int fd = -1;
int FinalFanSpeed = 0;
- int CPUtemp=0;
-
- r = -1;
- while(r < 0) {
- /* Connect to the user bus this time */
- r = sd_bus_open_system(&bus);
- if(r < 0){
- fprintf(stderr, "fan 1 Failed to connect to system bus: %s\n", strerror(-r));
- sleep(1);
- }
+ int CPUtemp = 0;
+ do {
+ /* Connect to the user bus this time */
+ rc = sd_bus_open_system(&bus);
+ if(rc < 0) {
+ fprintf(stderr, "fan 1 Failed to connect to system bus: %s\n", strerror(-rc));
+ bus = sd_bus_flush_close_unref(bus);
+ sleep(1);
}
- // SD Bus error report mechanism.
- sd_bus_error bus_error = SD_BUS_ERROR_NULL;
- sd_bus_message *response = NULL, *m = NULL;;
- sd_bus_error_free(&bus_error);
- sd_bus_message_unref(response);
-
-
-while(1){
- fd = i2c_open();
- CPUtemp=0;
- for(i=0;i<12;i++){
- sd_bus_error_free(&bus_error);
-
- rc = sd_bus_call_method(bus, // On the System Bus
- gService, // Service to contact
- gCPU0ObjPath[i], // Object path
- gIntPath, // Interface name
- "getValue", // Method to be called
- &bus_error, // object to return error
- &response, // Response message on success
- NULL); // input message (string,byte)
-
- if(rc < 0)
- {
- //fprintf(stderr, "gCPU0ObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message);
- // goto finish;
- CPU0_core_temperature[i]=0;
- }
- else
- {
- rc = sd_bus_message_read(response, "v","i", &CPU0_core_temperature[i]);
- if (rc < 0 )
- {
- // fprintf(stderr, "gCPU0ObjPath Failed to parse response message:[%s]\n", strerror(-rc));
- // goto finish;
+ } while (rc < 0);
+
+ while (1) {
+ CPUtemp = 0;
+ for(i=0; i<12; i++) {
+ rc = sd_bus_call_method(bus, // On the System Bus
+ gService, // Service to contact
+ gCPU0ObjPath[i], // Object path
+ gIntPath, // Interface name
+ "getValue", // Method to be called
+ &bus_error, // object to return error
+ &response, // Response message on success
+ NULL); // input message (string,byte)
+ if(rc < 0) {
+// fprintf(stderr, "gCPU0ObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message);
+ CPU0_core_temperature[i] = 0;
+ } else {
+ rc = sd_bus_message_read(response, "v","i", &CPU0_core_temperature[i]);
+ if (rc < 0 ) {
+ fprintf(stderr, "gCPU0ObjPath Failed to parse response message:[%s]\n", strerror(-rc));
+ CPU0_core_temperature[i] = 0;
+ }
}
+// fprintf(stderr, "CPU0 core %d temperature is %d\n",i ,CPU0_core_temperature[i]);
+ if(CPU0_core_temperature[i] > HighestCPUtemp) {
+ HighestCPUtemp = CPU0_core_temperature[i];
+ CPUnocore[0] = 0;
+ CPUnocore[1] = i;
+ }
+ CPUtemp = CPUtemp + CPU0_core_temperature[i];
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
}
- //printf("CPU0 core %d value=[%d] \n",i,CPU0_core_temperature[i]);
- if(CPU0_core_temperature[i] > HighestCPUtemp )
- {
- HighestCPUtemp = CPU0_core_temperature[i];
- CPUnocore[0]=0;
- CPUnocore[1]=i;
- }
- CPUtemp=CPUtemp+CPU0_core_temperature[i];
- }
-
- for(i=0;i<12;i++){
- sd_bus_error_free(&bus_error);
-
- rc = sd_bus_call_method(bus, // On the System Bus
- gService, // Service to contact
- gCPU1ObjPath[i], // Object path
- gIntPath, // Interface name
- "getValue", // Method to be called
- &bus_error, // object to return error
- &response, // Response message on success
- NULL); // input message (string,byte)
-
- if(rc < 0)
- {
- //fprintf(stderr, "gCPU1ObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message);
- CPU1_core_temperature[i]=0;
- //goto finish;
- }
- else
- {
- rc = sd_bus_message_read(response, "v","i", &CPU1_core_temperature[i]);
-
- }
-
- if(CPU1_core_temperature[i] > HighestCPUtemp )
- {
- HighestCPUtemp = CPU1_core_temperature[i];
- CPUnocore[0]=1;
- CPUnocore[1]=i;
+ for(i=0; i<12; i++) {
+ rc = sd_bus_call_method(bus, // On the System Bus
+ gService, // Service to contact
+ gCPU1ObjPath[i], // Object path
+ gIntPath, // Interface name
+ "getValue", // Method to be called
+ &bus_error, // object to return error
+ &response, // Response message on success
+ NULL); // input message (string,byte)
+ if(rc < 0) {
+// fprintf(stderr, "gCPU1ObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message);
+ CPU1_core_temperature[i] = 0;
+ } else {
+ rc = sd_bus_message_read(response, "v","i", &CPU1_core_temperature[i]);
+ if (rc < 0 ) {
+ fprintf(stderr, "gCPU1ObjPath Failed to parse response message:[%s]\n", strerror(-rc));
+ CPU1_core_temperature[i] = 0;
+ }
+ }
+// fprintf(stderr, "CPU1 core %d temperature is %d\n",i ,CPU1_core_temperature[i]);
+ if(CPU1_core_temperature[i] > HighestCPUtemp ) {
+ HighestCPUtemp = CPU1_core_temperature[i];
+ CPUnocore[0] = 1;
+ CPUnocore[1] = i;
+ }
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
}
-
- }
-
+// fprintf(stderr, "Highest CPU temperature = [%d]\n", HighestCPUtemp);
- for(i=0;i<32;i++){
- sd_bus_error_free(&bus_error);
-
- rc = sd_bus_call_method(bus, // On the System Bus
- gService, // Service to contact
- gDIMMObjPath[i], // Object path
- gIntPath, // Interface name
- "getValue", // Method to be called
- &bus_error, // object to return error
- &response, // Response message on success
- NULL); // input message (string,byte)
-
- if(rc < 0)
- {
-
- DIMM_temperature[i]=0;
- }
- else
- {
- rc = sd_bus_message_read(response, "v","i", &DIMM_temperature[i]);
-
- if (rc < 0 )
- {
- fprintf(stderr, "gDIMMObjPath Failed to parse response message:[%s]\n", strerror(-rc));
-
+ for(i=0; i<32; i++) {
+ rc = sd_bus_call_method(bus, // On the System Bus
+ gService, // Service to contact
+ gDIMMObjPath[i], // Object path
+ gIntPath, // Interface name
+ "getValue", // Method to be called
+ &bus_error, // object to return error
+ &response, // Response message on success
+ NULL); // input message (string,byte)
+ if(rc < 0) {
+// fprintf(stderr, "gDIMMObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message);
+ DIMM_temperature[i] = 0;
+ } else {
+ rc = sd_bus_message_read(response, "v","i", &DIMM_temperature[i]);
+ if (rc < 0 ) {
+ fprintf(stderr, "gDIMMObjPath Failed to parse response message:[%s]\n", strerror(-rc));
+ DIMM_temperature[i] = 0;
+ }
}
-
+// fprintf(stderr, "DIMM %d temperature is %d\n", i, DIMM_temperature[i]);
+ if(DIMM_temperature[i] > HighestDIMMtemp )
+ HighestDIMMtemp = DIMM_temperature[i];
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
}
+// fprintf(stderr, "Highest DIMM temperature = [%d]\n",HighestDIMMtemp);
+
+ rc = sd_bus_call_method(bus, // On the System Bus
+ gService, // Service to contact
+ gObjPath_Ambient, // Object path
+ gIntPath, // Interface name
+ "getValue", // Method to be called
+ &bus_error, // object to return error
+ &response, // Response message on success
+ NULL); // input message (string,byte)
+ if(rc < 0) {
+// fprintf(stderr, "fan2 Failed to resolve fruid to dbus: %s\n", bus_error.message);
+ Ambient_reading = 0;
+ } else {
+ rc = sd_bus_message_read(response, "v","i", &Ambient_reading);
+ if (rc < 0 ) {
+ fprintf(stderr, "fan3 Failed to parse response message:[%s]\n", strerror(-rc));
+ Ambient_reading = 0;
+ }
+ }
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
+// fprintf(stderr, "Highest ambient inlet temperature = [%d]\n", HighestCPUtemp);
- if(DIMM_temperature[i] > HighestDIMMtemp )
- HighestDIMMtemp = DIMM_temperature[i];
- }
- printf("Highest DIMM temperatur is value %d \n",HighestDIMMtemp);
-
-
-
- sd_bus_error_free(&bus_error);
- rc = sd_bus_call_method(bus, // On the System Bus
- gService, // Service to contact
- gObjPath_Ambient, // Object path
- gIntPath, // Interface name
- "getValue", // Method to be called
- &bus_error, // object to return error
- &response, // Response message on success
- NULL); // input message (string,byte)
- // NULL); // First argument to getObjectFromId
- //"BOARD_1"); // Second Argument
-
- if(rc < 0)
- {
- fprintf(stderr, "fan2 Failed to resolve fruid to dbus: %s\n", bus_error.message);
-
- }
-
- rc = sd_bus_message_read(response, "v","i", &Ambient_reading);
- if (rc < 0 )
- {
- fprintf(stderr, "fan3 Failed to parse response message:[%s]\n", strerror(-rc));
-
- }
-
- if (CPUtemp==0)
- {
- HighestCPUtemp=0;
- HighestDIMMtemp=0;
- }
-
- CloseLoop(HighestCPUtemp,HighestDIMMtemp);
- OpenLoop(Ambient_reading);
+ if (CPUtemp == 0) {
+ HighestCPUtemp = 0;
+ HighestDIMMtemp = 0;
+ }
-
+ CloseLoop(HighestCPUtemp,HighestDIMMtemp);
+ OpenLoop(Ambient_reading);
- if(Openloopspeed>Closeloopspeed)
- g_fanspeed=Openloopspeed;
+ if(Openloopspeed > Closeloopspeed)
+ g_fanspeed = Openloopspeed;
else
- g_fanspeed=Closeloopspeed;
+ g_fanspeed = Closeloopspeed;
- if(g_fanspeed>30)
- SetFanLed(fd,1);
- else
- SetFanLed(fd,2);
-
- FinalFanSpeed=g_fanspeed*255;
- FinalFanSpeed=FinalFanSpeed/100;
-
- if(HighestCPUtemp==0) //OCC sensor does not enable
- {
- FinalFanSpeed=255;
- }
-
+ fd = i2c_open();
+ if (fd == -1) {
+ fprintf(stderr, "Fail to set FAN LED\n");
+ } else {
+ if(g_fanspeed > 30)
+ SetFanLed(fd,1);
+ else
+ SetFanLed(fd,2);
+ close(fd);
+ }
- for(i=0;i<6;i++){
-
- sd_bus_error_free(&bus_error);
- rc = sd_bus_call_method(bus, // On the System Bus
- gService, // Service to contact
- fanObjPath[i], // Object path
- gIntPath, // Interface name
- "setValue", // Method to be called
- &bus_error, // object to return error
- &response, // Response message on success
- "i", // input message (string,byte)
- FinalFanSpeed); // First argument
-
- if(rc < 0)
- {
- fprintf(stderr, "fanObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message);
- // goto finish;
- }
-
-
- }
-
- close(fd);
- sleep(1);
+ FinalFanSpeed = g_fanspeed * 255;
+ FinalFanSpeed = FinalFanSpeed / 100;
+
+ if(HighestCPUtemp == 0) //OCC sensor does not enable
+ FinalFanSpeed = 255;
+
+ for(i=0; i<6; i++) {
+ rc = sd_bus_call_method(bus, // On the System Bus
+ gService, // Service to contact
+ fanObjPath[i], // Object path
+ gIntPath, // Interface name
+ "setValue", // Method to be called
+ &bus_error, // object to return error
+ &response, // Response message on success
+ "i", // input message (string,byte)
+ FinalFanSpeed); // First argument
+ if(rc < 0)
+ fprintf(stderr, "fanObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message);
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
+ }
-
- finish:
- sd_bus_unref(bus);
+finish:
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
+ sd_bus_flush(bus);
sleep(1);
-}
- return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ }
+ bus = sd_bus_flush_close_unref(bus);
+ return rc < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}
diff --git a/objects/info.c b/objects/info.c
index d872c3f..2b98dbb 100644
--- a/objects/info.c
+++ b/objects/info.c
@@ -17,7 +17,6 @@ const char *gIntPath_c = "org.openbmc.control.Chassis";
//const char *chassis_iface = "org.openbmc.SensorValue";
char *gMessage = NULL;
-sd_bus *bus = NULL;
#define MAX_BYTES 255
@@ -32,323 +31,296 @@ uint8_t g_read_tmp[MAX_BYTES];
uint8_t g_bus = -1;
uint8_t g_slave_addr = 0xff;
-static int i2c_open() {
- int fd;
- char fn[32];
- int rc;
-
- g_bus = 6;
- snprintf(fn, sizeof(fn), "/dev/i2c-%d", g_bus);
- fd = open(fn, O_RDWR);
- if (fd == -1) {
- LOG_ERR(errno, "Failed to open i2c device %s", fn);
- close(fd);
- return -1;
- }
-
- g_slave_addr = 0x4f;
- rc = ioctl(fd, I2C_SLAVE, g_slave_addr);
- if (rc < 0) {
- LOG_ERR(errno, "Failed to open slave @ address 0x%x", g_slave_addr);
- close(fd);
- }
-
- return fd;
+static int i2c_open()
+{
+ int rc = 0, fd = -1;
+ char fn[32];
+
+ g_bus = 6;
+ snprintf(fn, sizeof(fn), "/dev/i2c-%d", g_bus);
+ fd = open(fn, O_RDWR);
+ if (fd == -1) {
+ LOG_ERR(errno, "Failed to open i2c device %s", fn);
+ close(fd);
+ return -1;
+ }
+
+ g_slave_addr = 0x4f;
+
+ rc = ioctl(fd, I2C_SLAVE, g_slave_addr);
+ if (rc < 0) {
+ LOG_ERR(errno, "Failed to open slave @ address 0x%x", g_slave_addr);
+ close(fd);
+ }
+
+ return fd;
}
static int i2c_io(int fd) {
- struct i2c_rdwr_ioctl_data data;
- struct i2c_msg msg[2];
- int n_msg = 0;
- int rc;
-
- memset(&msg, 0, sizeof(msg));
-
- g_slave_addr = 0x5f;
- g_use_pec = 0;
- g_n_write = 3;
- g_write_bytes[0] = 0xfc;
- g_write_bytes[1] = 0x3;
- g_write_bytes[2] = 0x0;
-
-
- g_n_read = 5;
-
-
- if (1) {
- msg[n_msg].addr = g_slave_addr;
- msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0;
- msg[n_msg].len = g_n_write;
- msg[n_msg].buf = g_write_bytes;
- n_msg++;
- }
-
- if (1) {
- msg[n_msg].addr = g_slave_addr;
- msg[n_msg].flags = I2C_M_RD
- | ((g_use_pec) ? I2C_CLIENT_PEC : 0)
- | ((g_n_read == 0) ? I2C_M_RECV_LEN : 0);
- /*
- * In case of g_n_read is 0, block length will be added by
- * the underlying bus driver.
- */
- msg[n_msg].len = (g_n_read) ? g_n_read : 256;
- msg[n_msg].buf = g_read_bytes;
- if (g_n_read == 0) {
- /* If we're using variable length block reads, we have to set the
- * first byte of the buffer to at least one or the kernel complains.
- */
- g_read_bytes[0] = 1;
- }
- n_msg++;
- }
-
- data.msgs = msg;
- data.nmsgs = n_msg;
-
- rc = ioctl(fd, I2C_RDWR, &data);
- if (rc < 0) {
- LOG_ERR(errno, "Failed to do raw io");
- close(fd);
- return -1;
- }
-
- return 0;
+ struct i2c_rdwr_ioctl_data data;
+ struct i2c_msg msg[2];
+ int rc = 0, n_msg = 0;
+
+ memset(&msg, 0, sizeof(msg));
+
+ g_slave_addr = 0x5f;
+ g_use_pec = 0;
+ g_n_write = 3;
+ g_write_bytes[0] = 0xfc;
+ g_write_bytes[1] = 0x3;
+ g_write_bytes[2] = 0x0;
+ g_n_read = 5;
+
+ if (1) {
+ msg[n_msg].addr = g_slave_addr;
+ msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0;
+ msg[n_msg].len = g_n_write;
+ msg[n_msg].buf = g_write_bytes;
+ n_msg++;
+ }
+
+ if (1) {
+ msg[n_msg].addr = g_slave_addr;
+ msg[n_msg].flags = I2C_M_RD | ((g_use_pec) ? I2C_CLIENT_PEC : 0)
+ | ((g_n_read == 0) ? I2C_M_RECV_LEN : 0);
+ /*
+ * In case of g_n_read is 0, block length will be added by
+ * the underlying bus driver.
+ */
+ msg[n_msg].len = (g_n_read) ? g_n_read : 256;
+ msg[n_msg].buf = g_read_bytes;
+ if (g_n_read == 0) {
+ /* If we're using variable length block reads, we have to set the
+ * first byte of the buffer to at least one or the kernel complains.
+ */
+ g_read_bytes[0] = 1;
+ }
+ n_msg++;
+ }
+
+ data.msgs = msg;
+ data.nmsgs = n_msg;
+
+ rc = ioctl(fd, I2C_RDWR, &data);
+ if (rc < 0) {
+ LOG_ERR(errno, "Failed to do raw io");
+ close(fd);
+ return -1;
+ }
+
+ return 0;
}
int get_hdd_status(void)
{
- int fd, i;
- char *test;
- test="Ken";
- char str[10];
- fd = i2c_open();
- if (fd < 0) {
- return -1;
- }
-
- if (i2c_io(fd) < 0) {
- close(fd);
- return -1;
- }
-
- //printf("Received:\n ");
- if (g_n_read == 0) {
- g_n_read = g_read_bytes[0] + 1;
- }
- for (i = 0; i < g_n_read; i++) {
- //printf(" 0x%x", g_read_bytes[i]);
- }
- if ((g_read_tmp[2]!=g_read_bytes[2])||(g_read_tmp[3]!=g_read_bytes[3]))
- {
- sprintf(str, "HDD change:0x%x,0x%x", g_read_bytes[2], g_read_bytes[3]);
-
- send_esel_to_dbus(str, "Low", "assoc", "hack", 3);
- }
-
- g_read_tmp[2]=g_read_bytes[2];
- g_read_tmp[3]=g_read_bytes[3];
- close(fd);
-}
+ int fd = -1, i = 0;
+ char *test = NULL;
+ test = "Ken";
+ char str[10];
+
+ fd = i2c_open();
+ if (fd < 0)
+ return -1;
+
+ if (i2c_io(fd) < 0) {
+ close(fd);
+ return -1;
+ }
-int send_esel_to_dbus(const char *desc, const char *sev, const char *details, uint8_t *debug, size_t debuglen) {
+// printf("Received:\n ");
+ if (g_n_read == 0)
+ g_n_read = g_read_bytes[0] + 1;
+#if 0
+ for (i = 0; i < g_n_read; i++)
+ printf(" 0x%x", g_read_bytes[i]);
+#endif
+
+ if ((g_read_tmp[2] != g_read_bytes[2]) || (g_read_tmp[3] != g_read_bytes[3])) {
+ sprintf(str, "HDD change:0x%x,0x%x", g_read_bytes[2], g_read_bytes[3]);
+ send_esel_to_dbus(str, "Low", "assoc", "hack", 3);
+ }
+
+ g_read_tmp[2]=g_read_bytes[2];
+ g_read_tmp[3]=g_read_bytes[3];
+ close(fd);
+}
+
+int send_esel_to_dbus(const char *desc, const char *sev, const char *details, uint8_t *debug, size_t debuglen)
+{
sd_bus *mbus = NULL;
- sd_bus_error error = SD_BUS_ERROR_NULL;
- sd_bus_message *reply = NULL, *m=NULL;
- uint16_t x;
- int r;
- sd_bus_error_free(&error);
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus_message *reply = NULL, *m = NULL;
+ uint16_t value = 0;
+ int ret = 0;
+
+ fprintf(stderr,"add sel\n");
+ ret = sd_bus_open_system(&mbus);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-ret));
+ goto finish;
+ }
- printf("add sel\n");
- r = sd_bus_open_system(&mbus);
- if (r < 0) {
- fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
+ ret = sd_bus_message_new_method_call(mbus,&m,
+ "org.openbmc.records.events",
+ "/org/openbmc/records/events",
+ "org.openbmc.recordlog",
+ "acceptHostMessage");
+ if (ret < 0) {
+ fprintf(stderr, "Failed to add the method object: %s\n", strerror(-ret));
goto finish;
}
- r = sd_bus_message_new_method_call(mbus,&m,
- "org.openbmc.records.events",
- "/org/openbmc/records/events",
- "org.openbmc.recordlog",
- "acceptHostMessage");
- if (r < 0) {
- fprintf(stderr, "Failed to add the method object: %s\n", strerror(-r));
- goto finish;
- }
-
- r = sd_bus_message_append(m, "sss", desc, sev, details);
- if (r < 0) {
- fprintf(stderr, "Failed add the message strings : %s\n", strerror(-r));
- goto finish;
- }
-
- r = sd_bus_message_append_array(m, 'y', debug, debuglen);
- if (r < 0) {
- fprintf(stderr, "Failed to add the raw array of bytes: %s\n", strerror(-r));
- goto finish;
- }
- // Call the IPMI responder on the bus so the message can be sent to the CEC
- r = sd_bus_call(mbus, m, 0, &error, &reply);
- if (r < 0) {
- fprintf(stderr, "Failed to call the method: %s %s\n", __FUNCTION__, strerror(-r));
- goto finish;
- }
- r = sd_bus_message_read(reply, "q", &x);
- if (r < 0) {
- fprintf(stderr, "Failed to get a rc from the method: %s\n", strerror(-r));
- }
+ ret = sd_bus_message_append(m, "sss", desc, sev, details);
+ if (ret < 0) {
+ fprintf(stderr, "Failed add the message strings : %s\n", strerror(-ret));
+ goto finish;
+ }
+
+ ret = sd_bus_message_append_array(m, 'y', debug, debuglen);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to add the raw array of bytes: %s\n", strerror(-ret));
+ goto finish;
+ }
+
+ // Call the IPMI responder on the bus so the message can be sent to the CEC
+ ret = sd_bus_call(mbus, m, 0, &error, &reply);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to call the method: %s %s\n", __FUNCTION__, strerror(-ret));
+ goto finish;
+ }
+ ret = sd_bus_message_read(reply, "q", &value);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to get a rc from the method: %s\n", strerror(-ret));
+ }
finish:
- sd_bus_error_free(&error);
- sd_bus_message_unref(m);
- sd_bus_message_unref(reply);
- return r;
+ sd_bus_error_free(&error);
+ m = sd_bus_message_unref(m);
+ reply = sd_bus_message_unref(reply);
+ mbus = sd_bus_flush_close_unref(mbus);
+ return ret;
}
-int start_system_information(void) {
-
- sd_bus *bus;
- sd_bus_slot *slot;
- int r, x, rc,retry;
- char *OccStatus;
- r = -1;
- while(r < 0) {
+
+int start_system_information(void)
+{
+ sd_bus *bus = NULL;
+ sd_bus_error bus_error = SD_BUS_ERROR_NULL;
+ sd_bus_message *response = NULL;
+ int ret = 0, value = 0;
+ char *OccStatus = NULL;
+
/* Connect to the user bus this time */
- r = sd_bus_open_system(&bus);
- if(r < 0){
- fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
+ do {
+ ret = sd_bus_open_system(&bus);
+ if(ret < 0) {
+ fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-ret));
+ bus = sd_bus_flush_close_unref(bus);
+ }
sleep(1);
- }
- // goto finish;
+ } while (ret < 0);
+ while (1) {
+ ret = sd_bus_call_method(bus, // On the System Bus
+ gService_c, // Service to contact
+ gObjPath_c, // Object path
+ gIntPath_c, // Interface name
+ "getPowerState", // Method to be called
+ &bus_error, // object to return error
+ &response, // Response message on success
+ NULL); // input message (string,byte)
+ if(ret < 0) {
+// fprintf(stderr, "Failed to resolve getPowerState to dbus: %s\n", bus_error.message);
+ goto finish;
}
- // SD Bus error report mechanism.
- sd_bus_error bus_error = SD_BUS_ERROR_NULL;
- sd_bus_message *response = NULL, *m = NULL;;
- sd_bus_error_free(&bus_error);
- sd_bus_message_unref(response);
-// send_esel_to_dbus("desc", "sev", "assoc", "hack", 3);
-
-while(1){
- sd_bus_error_free(&bus_error);
-
-
-
- rc = sd_bus_call_method(bus, // On the System Bus
- gService_c, // Service to contact
- gObjPath_c, // Object path
- gIntPath_c, // Interface name
- "getPowerState", // Method to be called
- &bus_error, // object to return error
- &response, // Response message on success
- NULL); // input message (string,byte)
- // NULL); // First argument to getObjectFromId
- //"BOARD_1"); // Second Argument
- if(rc < 0)
- {
- fprintf(stderr, "Failed to resolve getPowerState to dbus: %s\n", bus_error.message);
- r = sd_bus_open_system(&bus);
- if(r < 0){
- fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
- sleep(1);
- }
-
- goto finish;
- }
-
- rc = sd_bus_message_read(response, "i", &x);
- if (rc < 0 )
- {
- fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-rc));
- goto finish;
- }
- printf("PowerState value=[%d] \n",x);
- if (x == 0 ) goto finish;
- get_hdd_status();
- sleep(1);
- sd_bus_error_free(&bus_error);
- rc = sd_bus_call_method(bus, // On the System Bus
- gService, // Service to contact
- gObjPath_o, // Object path
- gIntPath, // Interface name
- "getValue", // Method to be called
- &bus_error, // object to return error
- &response, // Response message on success
- NULL); // input message (string,byte)
- // NULL); // First argument to getObjectFromId
- //"BOARD_1"); // Second Argument
- if(rc < 0)
- {
- fprintf(stderr, "Failed to resolve fruid to dbus: %s\n", bus_error.message);
- goto finish;
- }
-
- rc = sd_bus_message_read(response, "v","s", &OccStatus);
- if (rc < 0 )
- {
- fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-rc));
- goto finish;
- }
- printf("OCCtate value=[%s][%d] \n",OccStatus,strcmp(OccStatus, "Disable"));
+
+ ret = sd_bus_message_read(response, "i", &value);
+ if (ret < 0 ) {
+ fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-ret));
+ goto finish;
+ }
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
+// fprintf(stderr,"PowerState value = [%d] \n",value);
+ if (value == 0 )
+ goto finish;
- if (strcmp(OccStatus, "Disable") != 1 ) goto finish;
-
- rc = sd_bus_call_method(bus, // On the System Bus
- gService, // Service to contact
- gObjPath, // Object path
- gIntPath, // Interface name
- "getValue", // Method to be called
- &bus_error, // object to return error
- &response, // Response message on success
- NULL); // input message (string,byte)
- // NULL); // First argument to getObjectFromId
- //"BOARD_1"); // Second Argument
-
- if(rc < 0)
- {
- fprintf(stderr, "Failed to resolve fruid to dbus: %s\n", bus_error.message);
- goto finish;
- }
-
- rc = sd_bus_message_read(response, "v","i", &x);
- if (rc < 0 )
- {
- fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-rc));
- goto finish;
- }
- printf("CPU value=[%d] \n",x);
-
- if(x >= 90)
- {
- //printf("====Ken poweroff==== \n");
- send_esel_to_dbus("CPU thermal trip", "High", "assoc", "hack", 3);
- sd_bus_error_free(&bus_error);
- rc = sd_bus_call_method(bus, // On the System Bus
- gService_c, // Service to contact
- gObjPath_c, // Object path
- gIntPath_c, // Interface name
- "powerOff", // Method to be called
- &bus_error, // object to return error
- &response, // Response message on success
- NULL); // input message (string,byte)
- // NULL); // First argument to getObjectFromId
- //"BOARD_1"); // Second Argument
-
- if(rc < 0)
- {
- fprintf(stderr, "Failed to resolve poweroff to dbus: %s\n", bus_error.message);
- goto finish;
- }
+ get_hdd_status();
- }
+ sleep(1);
+
+ ret = sd_bus_call_method(bus, // On the System Bus
+ gService, // Service to contact
+ gObjPath_o, // Object path
+ gIntPath, // Interface name
+ "getValue", // Method to be called
+ &bus_error, // object to return error
+ &response, // Response message on success
+ NULL); // input message (string,byte)
+ if(ret < 0) {
+ fprintf(stderr, "Failed to resolve fruid to dbus: %s\n", bus_error.message);
+ goto finish;
+ }
+ ret = sd_bus_message_read(response, "v","s", &OccStatus);
+ if (ret < 0 ) {
+ fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-ret));
+ goto finish;
+ }
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
+ fprintf(stderr,"OCCState value = [%s][%d] \n",OccStatus,strcmp(OccStatus, "Disable"));
+ if (strcmp(OccStatus, "Disable") != 1 )
+ goto finish;
+
+ ret = sd_bus_call_method(bus, // On the System Bus
+ gService, // Service to contact
+ gObjPath, // Object path
+ gIntPath, // Interface name
+ "getValue", // Method to be called
+ &bus_error, // object to return error
+ &response, // Response message on success
+ NULL); // input message (string,byte)
+ if(ret < 0) {
+ fprintf(stderr, "Failed to resolve fruid to dbus: %s\n", bus_error.message);
+ goto finish;
+ }
+ ret = sd_bus_message_read(response, "v","i", &value);
+ if (ret < 0 ) {
+ fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-ret));
+ goto finish;
+ }
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
+ fprintf(stderr,"CPU value = [%d] \n",value);
+ if(value >= 90) {
+ //printf("====Ken poweroff==== \n");
+ send_esel_to_dbus("CPU thermal trip", "High", "assoc", "hack", 3);
+
+ ret = sd_bus_call_method(bus, // On the System Bus
+ gService_c, // Service to contact
+ gObjPath_c, // Object path
+ gIntPath_c, // Interface name
+ "powerOff", // Method to be called
+ &bus_error, // object to return error
+ &response, // Response message on success
+ NULL); // input message (string,byte)
+
+ if(ret < 0) {
+ fprintf(stderr, "Failed to resolve poweroff to dbus: %s\n", bus_error.message);
+ goto finish;
+ }
+ sd_bus_error_free(&bus_error);
+ }
- sleep(1);
-/// sd_bus_unref(bus);
- finish:
- sd_bus_unref(bus);
+finish:
+ sd_bus_error_free(&bus_error);
+ response = sd_bus_message_unref(response);
+ sd_bus_flush(bus);
sleep(1);
-}
- return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ }
+
+ bus = sd_bus_flush_close_unref(bus);
+ return ret < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}
--
2.8.1
More information about the openbmc
mailing list