extern int acct_gather_energy_p_set_data(enum acct_energy_type data_type, void *data) { int rc = SLURM_SUCCESS; int *delta = (int *)data; xassert(_run_in_daemon()); switch (data_type) { case ENERGY_DATA_RECONFIG: debug_flags = slurm_get_debug_flags(); break; case ENERGY_DATA_PROFILE: slurm_mutex_lock(&ipmi_mutex); _get_joules_task(*delta); _ipmi_send_profile(); slurm_mutex_unlock(&ipmi_mutex); break; default: error("acct_gather_energy_p_set_data: unknown enum %d", data_type); rc = SLURM_ERROR; break; } return rc; }
extern int acct_gather_energy_p_get_data(enum acct_energy_type data_type, void *data) { int rc = SLURM_SUCCESS; acct_gather_energy_t *energy = (acct_gather_energy_t *)data; time_t *last_poll = (time_t *)data; uint16_t *sensor_cnt = (uint16_t *)data; xassert(_run_in_daemon()); switch (data_type) { case ENERGY_DATA_JOULES_TASK: if (local_energy->current_watts == NO_VAL) energy->consumed_energy = NO_VAL; else _get_joules_task(energy); break; case ENERGY_DATA_NODE_ENERGY: case ENERGY_DATA_STRUCT: memcpy(energy, local_energy, sizeof(acct_gather_energy_t)); break; case ENERGY_DATA_LAST_POLL: *last_poll = local_energy->poll_time; break; case ENERGY_DATA_SENSOR_CNT: *sensor_cnt = 1; break; default: error("acct_gather_energy_p_get_data: unknown enum %d", data_type); rc = SLURM_ERROR; break; } return rc; }
extern int acct_gather_energy_p_update_node_energy(void) { int rc = SLURM_SUCCESS; xassert(_run_in_daemon()); if (!local_energy || local_energy->current_watts == NO_VAL) return rc; _get_joules_task(local_energy); return rc; }
extern int acct_gather_energy_p_get_data(enum acct_energy_type data_type, void *data) { int rc = SLURM_SUCCESS; acct_gather_energy_t *energy = (acct_gather_energy_t *)data; time_t *last_poll = (time_t *)data; xassert(_run_in_daemon()); switch (data_type) { case ENERGY_DATA_JOULES_TASK: slurm_mutex_lock(&ipmi_mutex); if (_is_thread_launcher()) { _thread_init(); _thread_update_node_energy(); } else _get_joules_task(10); /* Since we don't have access to the frequency here just send in something. */ memcpy(energy, local_energy, sizeof(acct_gather_energy_t)); slurm_mutex_unlock(&ipmi_mutex); break; case ENERGY_DATA_STRUCT: slurm_mutex_lock(&ipmi_mutex); memcpy(energy, local_energy, sizeof(acct_gather_energy_t)); slurm_mutex_unlock(&ipmi_mutex); if (debug_flags & DEBUG_FLAG_ENERGY) { info("_get_joules_node_ipmi = consumed %d Joules", energy->consumed_energy); } break; case ENERGY_DATA_LAST_POLL: slurm_mutex_lock(&ipmi_mutex); *last_poll = local_energy->poll_time; slurm_mutex_unlock(&ipmi_mutex); break; default: error("acct_gather_energy_p_get_data: unknown enum %d", data_type); rc = SLURM_ERROR; break; } return rc; }
extern void acct_gather_energy_p_conf_set(s_p_hashtbl_t *tbl) { static bool flag_init = 0; if (!_run_in_daemon()) return; if (!flag_init) { flag_init = 1; local_energy = acct_gather_energy_alloc(1); if (!_get_latest_stats(GET_ENERGY)) local_energy->current_watts = NO_VAL; else _get_joules_task(local_energy); } debug("%s loaded", plugin_name); return; }
extern void acct_gather_energy_p_conf_set(s_p_hashtbl_t *tbl) { char *tmp_char; /* Set initial values */ reset_slurm_ipmi_conf(&slurm_ipmi_conf); if (tbl) { /* ipmi initialisation parameters */ s_p_get_uint32(&slurm_ipmi_conf.driver_type, "EnergyIPMIDriverType", tbl); s_p_get_uint32(&slurm_ipmi_conf.disable_auto_probe, "EnergyIPMIDisableAutoProbe", tbl); s_p_get_uint32(&slurm_ipmi_conf.driver_address, "EnergyIPMIDriverAddress", tbl); s_p_get_uint32(&slurm_ipmi_conf.register_spacing, "EnergyIPMIRegisterSpacing", tbl); s_p_get_string(&slurm_ipmi_conf.driver_device, "EnergyIPMIDriverDevice", tbl); s_p_get_uint32(&slurm_ipmi_conf.protocol_version, "EnergyIPMIProtocolVersion", tbl); if (!s_p_get_string(&slurm_ipmi_conf.username, "EnergyIPMIUsername", tbl)) slurm_ipmi_conf.username = xstrdup(DEFAULT_IPMI_USER); s_p_get_string(&slurm_ipmi_conf.password, "EnergyIPMIPassword", tbl); if (!slurm_ipmi_conf.password) slurm_ipmi_conf.password = xstrdup("foopassword"); s_p_get_uint32(&slurm_ipmi_conf.privilege_level, "EnergyIPMIPrivilegeLevel", tbl); s_p_get_uint32(&slurm_ipmi_conf.authentication_type, "EnergyIPMIAuthenticationType", tbl); s_p_get_uint32(&slurm_ipmi_conf.cipher_suite_id, "EnergyIPMICipherSuiteId", tbl); s_p_get_uint32(&slurm_ipmi_conf.session_timeout, "EnergyIPMISessionTimeout", tbl); s_p_get_uint32(&slurm_ipmi_conf.retransmission_timeout, "EnergyIPMIRetransmissionTimeout", tbl); s_p_get_uint32(&slurm_ipmi_conf. workaround_flags, "EnergyIPMIWorkaroundFlags", tbl); if (!s_p_get_boolean(&slurm_ipmi_conf.reread_sdr_cache, "EnergyIPMIRereadSdrCache", tbl)) slurm_ipmi_conf.reread_sdr_cache = false; if (!s_p_get_boolean(&slurm_ipmi_conf. ignore_non_interpretable_sensors, "EnergyIPMIIgnoreNonInterpretableSensors", tbl)) slurm_ipmi_conf.ignore_non_interpretable_sensors = false; if (!s_p_get_boolean(&slurm_ipmi_conf.bridge_sensors, "EnergyIPMIBridgeSensors", tbl)) slurm_ipmi_conf.bridge_sensors = false; if (!s_p_get_boolean(&slurm_ipmi_conf.interpret_oem_data, "EnergyIPMIInterpretOemData", tbl)) slurm_ipmi_conf.interpret_oem_data = false; if (!s_p_get_boolean(&slurm_ipmi_conf.shared_sensors, "EnergyIPMISharedSensors", tbl)) slurm_ipmi_conf.shared_sensors = false; if (!s_p_get_boolean(&slurm_ipmi_conf.discrete_reading, "EnergyIPMIDiscreteReading", tbl)) slurm_ipmi_conf.discrete_reading = false; if (!s_p_get_boolean(&slurm_ipmi_conf.ignore_scanning_disabled, "EnergyIPMIIgnoreScanningDisabled", tbl)) slurm_ipmi_conf.ignore_scanning_disabled = false; if (!s_p_get_boolean(&slurm_ipmi_conf.assume_bmc_owner, "EnergyIPMIAssumeBmcOwner", tbl)) slurm_ipmi_conf.assume_bmc_owner = false; if (!s_p_get_boolean(&slurm_ipmi_conf.entity_sensor_names, "EnergyIPMIEntitySensorNames", tbl)) slurm_ipmi_conf.entity_sensor_names = false; s_p_get_uint32(&slurm_ipmi_conf.freq, "EnergyIPMIFrequency", tbl); if ((int)slurm_ipmi_conf.freq <= 0) fatal("EnergyIPMIFrequency must be a positive integer " "in acct_gather.conf."); if (!s_p_get_boolean(&(slurm_ipmi_conf.adjustment), "EnergyIPMICalcAdjustment", tbl)) slurm_ipmi_conf.adjustment = false; s_p_get_uint32(&slurm_ipmi_conf.power_sensor_num, "EnergyIPMIPowerSensor", tbl); s_p_get_uint32(&slurm_ipmi_conf.timeout, "EnergyIPMITimeout", tbl); if (s_p_get_string(&tmp_char, "EnergyIPMIVariable", tbl)) { if (!strcmp(tmp_char, "Temp")) slurm_ipmi_conf.variable = IPMI_MONITORING_SENSOR_TYPE_TEMPERATURE; xfree(tmp_char); } } if (!_run_in_daemon()) return; if (!flag_init) { local_energy = acct_gather_energy_alloc(); local_energy->consumed_energy=0; local_energy->base_consumed_energy=0; local_energy->base_watts=0; flag_init = true; if (_is_thread_launcher()) { pthread_attr_t attr; slurm_attr_init(&attr); if (pthread_create(&thread_ipmi_id_launcher, &attr, &_thread_launcher, NULL)) { //if (pthread_create(... (void *)arg)) { debug("energy accounting failed to create " "_thread_launcher thread: %m"); } slurm_attr_destroy(&attr); if (debug_flags & DEBUG_FLAG_ENERGY) info("%s thread launched", plugin_name); } else _get_joules_task(0); } verbose("%s loaded", plugin_name); }